代码之家  ›  专栏  ›  技术社区  ›  Dano

在SQLServer Reporting Services查询中组合“like”和“in”?

  •  2
  • Dano  · 技术社区  · 16 年前

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

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

    ssrs使用参数前面的@operator来模拟“in”,我找不到将字符串与字符串列表匹配的方法。

    5 回复  |  直到 6 年前
        1
  •  4
  •   Registered User    16 年前

    关于如何将like运算符与参数一起使用,有几个选项。

    选项1

    如果将%添加到参数值中,则可以自定义类似筛选器的处理方式。例如,您的查询可以是:

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

    为了使数据集正确地使用LIKE语句,可以使用像SYSA%这样的参数值。当我使用此代码在SSR2008中测试样本报告时,返回了以下四个表:

     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

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

    选项4

    创建有助于动态生成SQL代码的.NET代码程序集。我认为这是一个过度杀伤力和糟糕的选择,但它可以想象的工作。

        2
  •  0
  •   Pulsehead    16 年前

    您是否尝试过:

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

        3
  •  0
  •   Hui    16 年前

    达诺,你用的是哪种版本的SSR?如果是RS2000,多参数列表是 没有官方支持,但有一个解决办法……

        4
  •  0
  •   Taryn Frank Pearson    13 年前

    这样做:

    select * 
    from tsStudent 
    where studentName like @SName+'%'
    
        5
  •  0
  •   Jeff Breadner    6 年前

    我知道这是一个非常古老的问题,但这是我在寻找解决相同问题的方法时发现的,最后我使用了一个这里没有描述的解决方案。我正在添加一个新的潜在解决方案来帮助其他人。

    如前所述,此解决方案仅在SQL Server 2016和更高版本中有效,但可以通过编写自定义的 string_split 使用子查询而不是CTE。

    首先,使用join将@searcheddescription作为单个字符串映射到数据集中:

    =JOIN(@SearchedDedscription, ",")

    然后使用字符串“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 搜索词CTE和主查询都试图抑制这种不适当的行重复。

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