【问题标题】:IN Operator in Dynamic SQL where Values are from Parameter动态 SQL 中的 IN 运算符,其中值来自参数
【发布时间】:2020-10-10 20:11:50
【问题描述】:

我是 SQL 的初学者。这可能是一篇旧帖子,但我没有得到任何简化的解决方案。

我关心的是如何在动态 SQL 中使用IN 子句,其中IN 项基于具有多个值的参数。

我有一个名为 Employee 的表。

我编写了一个动态 SQL,它将返回 Department = 'IT,System' 所在的员工列表

SQL:

Declare @Department varchar(50)
Declare @SQL nvarchar(MAX)
Declare @Parameters nvarchar(50)

Set @Department='IT,System'
SET @SQL = 'select * from Employee where Department IN(@PDepartment)'     
SET @Parameters=N'@PDepartment nvarchar(50)'

--PRINT @SQL    
EXEC sp_Executesql @SQL,@Parameters,@PDepartment=@Department

此脚本不适用于多个部门并且不返回任何结果。如果@Department = 'IT'

,则相同的查询返回结果

这里我提到了真实场景的一小部分。在实际情况下,IN 运算符中将包含的表名、列名都是动态的,并且将被接受为存储的 proc 参数。

感谢您的帮助。

【问题讨论】:

    标签: sql sql-server string select dynamic-sql


    【解决方案1】:

    此查询应该出错,因为您缺少列表元素周围的单引号。

    使用 table variable 作为参数而不是 CSV 字符串也会简单得多。

    至于处理字符串参数,您实际上并不需要动态SQL。如果您运行的是 SQL Server 2016 或更高版本,则可以使用table-valued function string_split()

    select e.*
    from employee e
    where exists (
        select 1 from string_split(@Department, ',') where value = e.department
    )
    

    在早期版本中,您可以使用like

    select e.*
    from employee e
    where ',' + @Department + ',' like '%,' + e.department + ',%'
    

    【讨论】:

    • 感谢@GMB 的回答。这里我提到了一个演示。这实际上是我只能使用动态 SQL 的地方需要的。那里的表名,列名应该包含IN操作符是动态的
    【解决方案2】:

    我对此不太感兴趣,您必须注意部门名称中的撇号,但一个简单的解决方案可能是:

    Declare @Department varchar(50)
    Declare @SQL nvarchar(MAX)
    
    Set @Department='IT,System'
    SET @SQL = 'select * from Employee where Department IN (''' + replace(@Department, ',', ''', ''') + ''')'
    
    PRINT @SQL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多