我已经在动态SQL中创建了一个过程,该过程具有一个select语句,并且代码如下所示:
ALTER PROCEDURE cagroup ( @DataID INT , @days INT , @GName VARCHAR(50) , @T_ID INT , @Act BIT , @Key VARBINARY(16) ) AS BEGIN DECLARE @SQL NVARCHAR(MAX) DECLARE @SchemaName SYSNAME DECLARE @TableName SYSNAME DECLARE @DatabaseName SYSNAME DECLARE @BR CHAR(2) SET @BR = CHAR(13) + CHAR(10) SELECT @SchemaName = Source_Schema , @TableName = Source_Table , @DatabaseName = Source_Database FROM Source WHERE ID = @DataID SET @SQL = 'SELECT ' + @GName + ' AS GrName ,' + @BR + @T_ID + ' AS To_ID ,' + @BR + @DataID + ' AS DataSoID ,' + @BR + @Act + ' AS Active ,' + @BR + Key + ' AS key' + @BR + 'R_ID AS S_R_ID' + @BR + 'FROM' + @DatabaseName + '.' + @SchemaName + '.' + @TableName + ' t' + @BR + 'LEFT OUTER JOIN Gro g ON g.GName = ' + @GName + @BR + 'AND g.Data_ID] =' + @DataID + @BR + 't.[I_DATE] > GETDATE() -' + @days + @BR + 'g.GName IS NULL AND ' + @GName + ' IS NOT NULL AND t.[Act] = 1' + @BR PRINT (@SQL) END
当我使用以下语句执行此过程时:
Exec dbo.cagroup 1,10,'[Gro]',1,1,NULL
我收到以下错误。
消息245,级别16,状态1,procedurecagroup,第33行将nvarchar值’SELECT [Gro] AS GName,’转换为数据类型int时,转换失败。
我在哪里做错了?
您需要在串联中将所有数字CAST转换为nvarchar。
没有隐式的VBA样式转换为字符串。在SQL Server中,数据类型优先级意味着int高于nvarchar:因此,整个字符串都试图通过CAST转换为int。
SET @SQL = 'SELECT ' + @GName + ' AS GrName ,' + @BR + CAST(@T_ID AS nvarchar(10)) + ' AS To_ID ,' ...
编辑:请问A有一个好点:注意NULL!