SQL Server中使用varchar和bigint的IN运算符

4

我在使用存储过程搜索并返回匹配ID列表时遇到了一些问题,这与数据类型有关。

一个参数作为字符串“32,1,5,78,43”传递到存储过程中-这需要作为IN运算符传递到查询中以搜索字段Column1。此字段的数据类型为Bigint。

DECLARE @TEST varchar(1000)
SET @TEST = REPLACE('32,1,5,78,43', '''','')

SELECT Column1, Column2 
FROM Table
WHERE Column1 IN(@TEST)

尝试从字符串中删除引号似乎不起作用,我收到了一个错误,显示“将数据类型varchar转换为bigint时出错”。
在没有存储过程的情况下运行代码,并直接将值放入IN运算符(不使用引号),然后可以正确地工作并返回正确的值。例如:
SELECT Column1, Column2 
FROM Table
WHERE Column1 IN(32,1,5,78,43)

请问有人能指导我这里错在哪里吗?


1
这里的答案非常好,但是你应该知道,你的查询不像你想象的那样工作的原因是你的 IN 比较的是一个字符串而不是一组整数。SQL Server 不能将逗号分隔的字符串隐式转换为一组值。 - Tim Lehner
4个回答

7

你也可以使用 动态SQL 来实现这个功能:

DECLARE @TEST varchar(1000)
DECLARE @SQLQuery AS NVARCHAR(500)

SET @TEST = '32,1,5,78,43'

SET @SQLQuery = 'SELECT Column1, Column2 FROM Table WHERE Column1 IN('+ @TEST +')'
EXECUTE(@SQLQuery)

3

编写整数在字符串列表中的测试的一种有效方法是:

DECLARE @TEST varchar(1000)
SET @TEST = '32,1,5,78,43'

SELECT Column1, Column2 
FROM Table
WHERE ',' + @TEST + ',' LIKE '%,' + cast(Column1 as varchar(16)) + ',%'

更好的方法是使用表参数将一个强类型整数列表传递给存储过程。

2

因此,您需要使用动态SQL,但在您的情况下不需要转义单引号,只需执行以下操作:

declare @sql varchar(max)
set @sql = 'Select Column1, Column2 from Table where Column1 in (' + @test + ')'
execute (@sql)

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接