首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态SQL不将VARCHAR转换为INT (无论如何不应该)

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

Stack Overflow用户
提问于 2013-03-28 14:39:49
回答 2查看 13.5K关注 0票数 2

我收到一个错误:

当将varchar值“插入到TableRowCount (IntFieldID,DecimalField)选择”转换为数据类型int时,转换失败

使用以下代码:

代码语言:javascript
复制
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),但这也不起作用。我还尝试从一个不起作用的DYNAMIC-SQL,开始,我试着在所有东西(没有工作)周围使用三个''',在我在线阅读的几个地方,响应建议将变量放在字符串中,这会产生错误:

必须声明标量变量@start

(这并不奇怪,因为这听起来不对)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-28 14:40:55

您需要将您的@Start转换为varchar

代码语言:javascript
复制
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。的转换图

票数 4
EN

Stack Overflow用户

发布于 2013-03-28 14:43:52

一个比尝试连接一个整数更好的方法是将它作为强类型参数传入:

代码语言:javascript
复制
DECLARE @start INT = 1;

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

EXEC sp_executesql @sql, N'@start INT', @start;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15684701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档