在动态sql中使用int类型变量

时间:2017-04-06 15:23:03

标签: sql sql-server variables dynamic

当我运行以下代码时:

DECLARE @FundConfigSetID INT = 1
DECLARE @sql NVARCHAR(MAX)

SET @sql = 'SELECT * FROM Correct.PolicyDetail C
            INNER JOIN config.fund f ON C.longfundid IN (f.fundid, f.longfundid)
                                     AND f.FundConfigSetID = ' + @FundConfigSetID

EXEC(@sql)

我收到此错误:

  

Msg 245,Level 16,State 1,Line 4
  转换varchar值时转换失败' SELECT *来自Correct.PolicyDetail C.   内连接config.fund f       在C.longfundid(f.fundid,f.longfundid)       和f.FundConfigSetID ='数据类型int。

我假设我的语法不正确

 and f.FundConfigSetID = '+@FundConfigSetID

有什么建议吗?

5 个答案:

答案 0 :(得分:2)

cast int附加到字符串类型时,需要将CAST(@FundConfigSetID AS NVARCHAR(10)) 附加到sql字符串:

DECLARE @FundConfigSetID INT = 1;

DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM Correct.PolicyDetail C
inner join config.fund f
    on C.longfundid in (f.fundid, f.longfundid)
    and f.FundConfigSetID = ' +  CAST(@FundConfigSetID AS NVARCHAR(10))

EXEC(@sql);

完成SQL:

int

参见文档:

CAST and CONVERT (Transact-SQL)

  

将一种数据类型的表达式转换为另一种数据类型。

当您的变量为int值时,SQL正在尝试将SQL子句的其余部分转换为DECLARE @FundConfigSetID INT = 1; DECLARE @sql NVARCHAR(MAX); SET @sql = '1' + @FundConfigSetID PRINT @sql -- output = 2 ,因为它认为您正在尝试将2个值一起添加,这就是错误归结为。通过将其转换为字符串类型,它知道您要将两个字符串附加在一起。

突出显示相反的情况,第一个字符串是数字:

constructor(public userData:userMetaData) {
    this.colors = this.userData.firstLetterColors;
    this.userData.currentPage = 'chats';
    this.math = Math;
}

答案 1 :(得分:1)

快速简便的选择

DECLARE @FundConfigSetID varchar(25) = 1

...'+cast(@FundConfigSetID as varchar(25))

答案 2 :(得分:0)

它正在尝试将您的变量(即int)添加到查询的其余部分。这是一个快速解决方案,可以解决您的问题:

DECLARE @FundConfigSetID int = 1

Declare @sql nvarchar(max)
SET @sql ='SELECT * FROM Correct.PolicyDetail C
inner join config.fund f
    on C.longfundid in (f.fundid, f.longfundid)
    and f.FundConfigSetID = '+ CAST(@FundConfigSetID AS NVARCHAR(10))

Exec(@sql)

答案 3 :(得分:0)

您需要先将int转换为varchar

DECLARE @FundConfigSetID int = 1

Declare @sql nvarchar(max)
SET @sql ='SELECT * FROM Correct.PolicyDetail C
  inner join config.fund f 
    on C.longfundid in (f.fundid, f.longfundid)
   and f.FundConfigSetID = '+ convert(varchar, @FundConfigSetID)

Exec(@sql)

答案 4 :(得分:0)

您需要将int转换为varchar,否则Sql server会尝试将varchar隐式转换为int:

'.... and f.FundConfigSetID = '+ CAST(@FundConfigSetID as varchar(10))