Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在存储过程中动态创建IN子句_Sql_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 在存储过程中动态创建IN子句

Sql 在存储过程中动态创建IN子句,sql,sql-server-2008,stored-procedures,Sql,Sql Server 2008,Stored Procedures,可能重复: 我使用的是SQL server 2008,这是我面临的问题。我有一个名为Cars的表,表中有一列Company。现在我有一个存储过程,看起来像这样 CREATE PROCEDURE FindCars (@CompanyNames varchar(500)) AS SELECT * FROM Cars WHERE Company IN (@CompanyNames) 我试过这样的方法,但失败了 DECLARE @CompanyNames varchar(500) SET @Compa

可能重复:

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

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子句中所需的字符串/数组。

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

比如,;其中x在z中选择y

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

WHERE x IN (SELECT item FROM dbo.split_string(@input_string))
有许多方法可以实现该拆分字符串。有些返回字符串,有些转换为整数,有些接受第二个分隔符参数,等等。您可以在internet上搜索SQL SERVER拆分字符串并获得许多结果,包括StackOverflow中的结果

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

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

SP_EXECEUTESQL @sql

我建议使用SP_EXECUTESQL而不是just EXEC,因为前者允许您使用参数化查询,但后者不允许。

只需添加一点,我认为这是更好的选择*从汽车内部连接选择项目从dbo.split_string@input_stringk on k.Item=Company因为你在谓词中使用迭代第一种方法是我推荐的,你可以在这里找到一个很好的分割函数: