【问题标题】:Dynamically creating the IN clause in a stored procedure [duplicate]在存储过程中动态创建 IN 子句 [重复]
【发布时间】:2012-08-08 11:48:17
【问题描述】:

可能重复:
Need help in dynamic query with IN Clause

我使用的是 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子句中需要的字符串/数组。

【问题讨论】:

    标签: sql sql-server-2008 stored-procedures


    【解决方案1】:

    您是对的,您创建了一个字符串,并将其作为包含一个字符串的字符串列表进行处理。逗号只是那个字符串中的字符。 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,因为前者允许您使用参数化查询,但后者不允许。)

    【讨论】:

    • 只是为了补充一点,我认为这更好select * from cars Inner join ( SELECT item FROM dbo.split_string(@input_string) )k on K.Item = Company 因为你正在使用IN Predicate 进行迭代
    • 第一种方法是我推荐的,你可以在这里找到一个不错的分割功能:http://www.sqlservercentral.com/articles/Tally+Table/72993/
    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多