当我运行以下代码时:
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
有什么建议吗?
答案 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
参见文档:
将一种数据类型的表达式转换为另一种数据类型。
当您的变量为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))