2012-08-08 78 views
7

可能重复:
Need help in dynamic query with IN Clause在存储过程中动态创建IN子句

我使用SQL Server 2008,这是我面临的问题。我有一个名为汽车与列公司的表。现在我有一个存储过程,看起来像这样

 
CREATE PROCEDURE FindCars (@CompanyNames varchar(500)) 
AS 
SELECT * FROM Cars WHERE Company IN (@CompanyNames) 

我想是这样的,未能

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

exec FindCars @CompanyNames 

我没有得到任何行返回。当我做了以下

 
DECLARE @CompanyNames varchar(500) 
SET @CompanyNames = '''Ford'',''BMW''' 

Select @CompanyNames 

我得到以下结果

 
'Ford','BMW' 

,如果我在存储过程中的SELECT语句替换该值,它的工作原理

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

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

回答

7

你是对的,你创建一个字符串,并且被处理为包含一个字符串的字符串列表。逗号只是那个字符串中的字符。 SQL Server中的数组唯一等价的是表。

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

为此,许多人创建一个SPLIT_STRING()函数,返回从给定逗号delimitted串项目表...

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因为前者允许你使用参数化查询,但后者没有。)

+1

只是补充一点,我觉得这是更好的'选择*从汽车 内部加入 ( \t选择项目从dbo.split_string(@input_string) )k 在K.Item = Company'因为你用'IN'做迭代Predicate – 2012-08-08 11:59:58

+0

第一种方法是我推荐的方法,你可以在这里找到一个很好的分割函数: [http://www.sqlservercentral.com/articles/Tally+Table /72993/](http://www.sqlservercentral.com/articles/Tally+Table/72993/) – lennin92 2017-02-20 15:25:32

相关问题