【问题标题】:Using an int type variable in dynamic sql在动态 sql 中使用 int 类型变量
【发布时间】:2017-09-01 17:32:19
【问题描述】:
当我运行以下代码时:
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)
我收到此错误:
消息 245,第 16 级,状态 1,第 4 行
转换 varchar 值 'SELECT * From Correct.PolicyDetail C 时转换失败
内连接 config.fund f
关于 C.longfundid 在 (f.fundid, f.longfundid)
和 f.FundConfigSetID = ' 到数据类型 int。
我假设我的语法不正确
and f.FundConfigSetID = '+@FundConfigSetID
有什么建议吗?
【问题讨论】:
标签:
sql
sql-server
variables
dynamic
【解决方案1】:
您需要将cast int 附加到一个字符串类型时将其附加到一个sql字符串:
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);
查看文档:
将一种数据类型的表达式转换为另一种数据类型。
由于您的变量是 int 值,SQL 正在尝试将 SQL 子句的其余部分转换为 int,因为它认为您正在尝试将这 2 个值相加,这就是错误归结为.通过将其转换为字符串类型,它知道您要将两个字符串附加在一起。
要突出显示相反的内容,第一个字符串是数字:
DECLARE @FundConfigSetID INT = 1;
DECLARE @sql NVARCHAR(MAX);
SET @sql = '1' + @FundConfigSetID
PRINT @sql
-- output = 2
【解决方案2】:
几个快速简单的选项
DECLARE @FundConfigSetID varchar(25) = 1
或
...'+cast(@FundConfigSetID as varchar(25))
【解决方案3】:
你需要先将 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】:
需要将int转换为varchar,否则Sql server会尝试将varchar隐式转换为int:
'.... and f.FundConfigSetID = '+ CAST(@FundConfigSetID as varchar(10))
【解决方案5】:
它正在尝试将您的变量(一个 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)