动态SQL不将VARCHAR转换为INT(无论如何都不应该)

时间:2013-03-28 14:39:49

标签: tsql 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

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

  

必须声明标量变量@start

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

2 个答案:

答案 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.

的转换表

enter image description here