使用存储过程搜索并使用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)
请问有人可以告诉我这里的错误吗?
答案 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,但这通常不太理想。