8

可能重复:
在使用 IN 子句进行动态查询时需要帮助

我正在使用 SQL Server 2008,这是我面临的问题。我有一个名为 Cars 的表,其中有一列 Company。现在我有一个看起来像这样的存储过程

创建过程 FindCars (@CompanyNames varchar(500))
作为
SELECT * FROM Cars WHERE Company IN (@CompanyNames)

我尝试了这样的事情并失败了

声明@CompanyNames varchar(500)
SET @CompanyNames = '''福特'',''宝马'''

执行 FindCars @CompanyNames

我没有返回任何行。当我执行以下操作时

声明@CompanyNames varchar(500)
SET @CompanyNames = '''福特'',''宝马'''

选择@CompanyNames

我得到以下结果

“福特”、“宝马”

如果我在存储过程中的 select 语句中替换这个值,它就可以工作

SELECT * FROM Cars where Company in ('Ford','BMW')

因此,我认为存储过程似乎被'Ford','BMW'视为一个字符串而不是一个数组。有人可以帮我解决这个问题。如何在存储过程中动态构造 select 语句的 IN 子句中所需的字符串/数组。

4

1 回答 1

7

没错,您创建了一个字符串,并将其作为包含一个字符串的字符串列表进行处理。逗号只是那个字符串中的字符。SQL Server 中数组的唯一等价物是表。

例如; WHERE x IN (SELECT y FROM z).

出于这个原因,许多人创建了一个SPLIT_STRING()函数,该函数从给定的逗号分隔字符串中返回一个项目表......

WHERE x IN (SELECT item FROM dbo.split_string(@input_string))

有很多方法可以实现该拆分字符串。一些返回字符串,一些转换为整数,一些接受第二个“分隔符”参数等,等等。您可以在互联网上搜索SQL SERVER SPLIT STRING并获得许多结果 - 包括 StackOverflow 中的此处。


另一种方法是使用动态 SQL;编写 SQL 的 SQL。

SET @sql = 'SELECT * FROM x WHERE y IN (' + @input_string_list + ')'

SP_EXECEUTESQL @sql

(我建议SP_EXECUTESQL不要这样做,EXEC因为前者允许您使用参数化查询,但后者不允许。)

于 2012-08-08T11:53:29.753 回答