动态SQL不将VARCHAR转换为INT(不应该反正)

Que*_*CPO 2 t-sql sql-server-2008-r2

我收到一个错误:

将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
Run Code Online (Sandbox Code Playgroud)

如果我删除IntFieldID@start,它将与一个插入工作(虽然它失败的目的).我已经尝试过包含一个SELECT CAST(' + @start + ' AS INT),这似乎有点多余,因为@startINT已经是一个(INT作为一个INT),但这也不起作用.我也尝试从一个N' DYNAMIC-SQL开始,它没有用,我尝试使用三个'''围绕一切(没有'工作),并在我在线阅读的几个地方,响应建议将变量放在字符串中,这产生了错误:

必须声明标量变量@start

(毫不奇怪,因为这听起来不正确).

Aar*_*and 5

比尝试连接整数更好的方法是将其作为强类型参数传递:

DECLARE @start INT = 1;

DECLARE @sql NVARCHAR(MAX) = N'INSERT ...
  SELECT @start, COUNT(*) FROM ' + @conn;

EXEC sp_executesql @sql, N'@start INT', @start;
Run Code Online (Sandbox Code Playgroud)