将nvarchar转换为int的动态SQL错误

时间:2011-05-17 17:03:38

标签: sql sql-server sql-server-2008 stored-procedures dynamic-sql

我在动态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

我收到以下错误。

  

Msg 245,Level 16,State 1,Procedurecagroup,Line 33   转换nvarchar值'SELECT [Gro] AS GName时转换失败,   '到数据类型int。

我在哪里做错了?

2 个答案:

答案 0 :(得分:14)

您需要在串联中将所有数字CAST到nvarchar。

没有隐式的VBA样式转换为字符串。在SQL Server中,数据类型优先级意味着整数高于nvarchar:所以整个字符串都尝试CAST为int。

SET @SQL =  'SELECT ' + @GName + ' AS GrName ,' + @BR
              + CAST(@T_ID AS nvarchar(10)) + ' AS To_ID ,' ...

编辑:A有一个好处:注意NULL!

答案 1 :(得分:1)

如果你必须构建这种动态SQL,最好从元数据中获取列信息,而不是传递它。

Select * from Information_Schema.Columns Where Table_name=@TableName

你必须编写一个丑陋的游标来构建SQL。期待性能问题。我在开发过程中为我编写代码做了很多,但我不敢在生产中运行它。