4

我在使用存储过程搜索并使用 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

4 回答 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)
于 2013-03-25T13:17:14.587 回答
3

编写 integer-in-string-list 测试的一种工作方法是:

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

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

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

于 2013-03-25T13:16:46.063 回答
2

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

declare @sql varchar(max)
set @sql = 'Select Column1, Column2 from Table where Column1 in (' + @test + ')'
execute (@sql)
于 2013-03-25T13:20:29.597 回答
1

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

这是拆分字符串的一个很好的代码示例: T-SQL:与字符串连接相反 - 如何将字符串拆分为多个记录

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

于 2013-03-25T13:22:40.793 回答