Sql 在存储过程中动态创建IN子句
可能重复: 我使用的是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')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
因此,我认为存储过程似乎将“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因为你在谓词中使用迭代第一种方法是我推荐的,你可以在这里找到一个很好的分割函数: