【问题标题】:Combine 'like' and 'in' in a SqlServer Reporting Services query?在 SqlServer Reporting Services 查询中组合“like”和“in”?
【发布时间】:2010-09-20 16:43:10
【问题描述】:

以下内容不起作用,但我正在寻找类似的东西。

select *
from Products
where Description like (@SearchedDescription + %)

SSRS 使用参数前面的 @ 运算符来模拟“in”,但我没有找到将字符串与字符串列表匹配的方法。

【问题讨论】:

    标签: reporting-services sql-like in-clause


    【解决方案1】:

    我知道这是超级旧的,但是在我寻找解决相同问题的过程中出现了这个问题,我最终使用了这里没有描述的解决方案。我正在添加一个新的潜在解决方案,以帮助其他可能追随的人。

    正如所写,此解决方案仅适用于 SQL Server 2016 及更高版本,但可以通过编写自定义 string_split UDF 以及使用子查询而不是 CTE 来适应旧版本。

    首先,使用 JOIN 将您的 @SearchedDescription 作为单个字符串映射到您的数据集中:

    =JOIN(@SearchedDedscription, ",")

    然后使用 STRING_SPLIT 将“A,B,C,D”类型的字符串映射到表格结构中。

    ;with
    SearchTerms as (
      select distinct
        Value
      from 
        string_split(@SearchedDescription, ',')
    )
    select distinct
      *
    from
      Products
      inner join SearchTerms on
        Products.Description like SearchTerms.Value + '%'
    

    如果有人多次添加相同的搜索词,则会在结果集中重复行。同样,单个产品可以匹配多个搜索词。我已将distinct 添加到 SearchTerms CTE 和主查询中,以尝试抑制这种不适当的行重复。

    如果您的查询更复杂(包括来自其他联接的结果),那么这可能会成为一个越来越大的问题。请注意,这是这种方法的主要缺点。

    【讨论】:

      【解决方案2】:

      这样写:

      select * 
      from tsStudent 
      where studentName like @SName+'%'
      

      【讨论】:

        【解决方案3】:

        Dano,您使用的是哪个版本的 SSRS?如果是RS2000,多参数列表是 没有官方支持,但有一个解决方法....

        【讨论】:

          【解决方案4】:

          关于如何使用带参数的 LIKE 运算符有几个选项。

          选项 1

          如果将 % 添加到参数值,则可以自定义 LIKE 过滤器的处理方式。例如,您的查询可能是:

           SELECT name
           FROM master.dbo.sysobjects
           WHERE name LIKE @ReportParameter1
          

          为了让数据集正确使用 LIKE 语句,您可以使用类似 sysa% 的参数值。当我使用此代码在 SSRS 2008 中测试示例报告时,我返回了以下四个表:

           sysallocunits
           sysaudacts
           sysasymkeys
           sysaltfiles
          

          选项 2

          另一种不需要用户添加任何“%”符号的方法是生成一个包含代码的变量并执行该变量。

           DECLARE @DynamicSQL NVARCHAR(MAX) 
          
           SET @DynamicSQL = 
           'SELECT  name, id, xtype
           FROM dbo.sysobjects
           WHERE name LIKE ''' + @ReportParameter1 + '%''
           '
          
           EXEC (@DynamicSQL)
          

          这将使您更好地控制如何使用 LIKE 语句。如果您不希望用户注入任何额外的运算符,那么您始终可以添加代码以去除非字母数字字符,然后再将其合并到最终查询中。

          选项 3

          您可以创建一个存储过程来控制此功能。我通常更喜欢使用存储过程作为 SSRS 的数据源,并且从不允许动态生成 SQL,但这只是我的偏好。这有助于在执行依赖性分析检查时提高可发现性,还可以确保最佳查询性能。

          选项 4

          创建有助于动态生成 SQL 代码的 .NET 代码程序集。我认为这是矫枉过正,充其量是一个糟糕的选择,但它可以工作。

          【讨论】:

            【解决方案5】:

            你有没有尝试过:

            select * from Products where Description like (@SearchedDescription + '%') (在 % 符号周围加上单引号?)

            【讨论】:

            • 试过了,如果选择了超过1个值就不行了。
            猜你喜欢
            • 2015-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多