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

时间:2013-03-25 13:14:39

标签: sql sql-server tsql

使用存储过程搜索并使用SQL IN运算符返回匹配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)

请问有人可以告诉我这里的错误吗?

4 个答案:

答案 0 :(得分:7)

您也可以使用 dynamic 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)

答案 1 :(得分: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 :(得分:2)

所以你需要使用动态SQL,但是你不需要在你的情况下转义单引号,只需这样做:

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

答案 3 :(得分:1)

您可以使用Split函数将逗号分隔的字符串拆分为临时表,然后加入到该表中。

以下是拆分字符串的代码示例: T-SQL: Opposite to string concatenation - how to split string into multiple records

您也可以执行动态SQL,但这通常不太理想。