2

我收到一个错误:

将 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,它将与插入一起使用(尽管它违背了目的)。我试过包括 a SELECT CAST(' + @start + ' AS INT),这似乎有点多余,因为@startINT已经是 a (将 an 转换INTINT),但这也不起作用。我还尝试从N' DYNAMIC-SQL开始,但没有成功,我尝试'''在所有内容中使用三个(没有工作),在我在线阅读的一些地方,响应建议将变量放入字符串中,这会生成错误:

必须声明标量变量@start

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

4

2 回答 2

5

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

DECLARE @start INT = 1;

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

EXEC sp_executesql @sql, N'@start INT', @start;
于 2013-03-28T14:43:52.767 回答
4

您需要将您的转换@Startvarchar.

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

SQL Server 根据一些相当复杂的标准在连接或添加的数据类型之间隐式转换。可以说,如果您尝试将 anint和一个字符串组合在一起,它将始终尝试将字符串转换为 an int,除非您明确告知它。

下面是来自 MSDN 的转换表供您参考。

在此处输入图像描述

于 2013-03-28T14:40:55.853 回答