动态SQL不转换VARCHAR到INT(不应该反正)(Dynamic SQL Not Convert

2019-08-18 03:16发布

我收到一个错误:

将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已经(铸造INTINT ),但也不管用。 我也试图与一个开始N' DYNAMIC-SQL,没有工作,我尝试用三个'''周围的一切(didnt的工作),并在这我在网上看了几个地方,反应建议把该变量在串,其生成错误:

必须声明标量变量@启动

(毫不奇怪,因为这不好听正确的)。

Answer 1:

您需要将转换@Startvarchar

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'INSERT INTO TableRowCount (IntFieldID, DecimalField)
SELECT ' + CAST(@start as nvarchar(20)) +', COUNT(*)
FROM ' + @conn

SQL Server将隐基于一些相当复杂的标准上串联或添加数据类型之间转换。 我只想说,如果你试图将一个结合int和弦,它就会一直尝试将字符串转换为int ,除非你告诉它另有明确。

下面是供您参考转换表从MSDN。



Answer 2:

不是试图串联的整数。更好的办法是在把它作为一个强类型的参数:

DECLARE @start INT = 1;

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

EXEC sp_executesql @sql, N'@start INT', @start;


文章来源: Dynamic SQL Not Converting VARCHAR To INT (shouldn't anyway)