我收到错误:
将varchar值'INSERT INTO TableRowCount(IntFieldID,DecimalField)SELECT'转换为数据类型int“
时转换失败
使用以下代码:
DECLARE @start INT -- @start is an INT
SET @start = 1 -- INT
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'INSERT INTO TableRowCount (IntFieldID, DecimalField)
SELECT ' + @start +', COUNT(*)
FROM dbo.somewhere' -- location is irrelevant
EXECUTE(@sql) -- this is where it fails
如果我删除IntFieldID
和@start
,它将使用插入(虽然它会失败)。我尝试添加SELECT CAST(' + @start + ' AS INT)
,这似乎有点多余,因为@start
已经是INT
(将INT
强加为INT
),但是也不起作用。我也尝试从N'
DYNAMIC-SQL 开始,这不起作用,我尝试使用三个'''
围绕一切(没有'工作),并在一些地方我在线阅读,回复建议将变量放在字符串中,这会产生错误:
必须声明标量变量@start
(毫不奇怪,因为听起来不正确)。
答案 0 :(得分:5)
比尝试连接整数更好的方法是将其作为强类型参数传递:
DECLARE @start INT = 1;
DECLARE @sql NVARCHAR(MAX) = N'INSERT ...
SELECT @start, COUNT(*) FROM ' + @conn;
EXEC sp_executesql @sql, N'@start INT', @start;
答案 1 :(得分:3)
您需要将@Start
转换为varchar
。
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'INSERT INTO TableRowCount (IntFieldID, DecimalField)
SELECT ' + CAST(@start as nvarchar(20)) +', COUNT(*)
FROM ' + @conn
SQL Server根据一些相当复杂的条件隐式转换串联或添加的数据类型。可以说,如果您尝试将int
和字符串组合在一起,它将始终尝试将字符串转换为int
,除非您明确说明它。
以下是您的参考from MSDN.
的转换表