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

时间:2008-11-04 14:34:00

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

以下不起作用,但我正在寻找这样的东西。

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

SSRS使用参数前面的@运算符来模拟'in',而我找不到将字符串与字符串列表匹配的方法。

5 个答案:

答案 0 :(得分: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代码程序集。我认为这是一种矫枉过正而且充其量不好的选择,但它可以想象得到。

答案 1 :(得分:0)

你有没有尝试过:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这样说:

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

答案 4 :(得分:0)

我知道这已经很老了,但是这是我为解决同一问题而进行的搜索,因此我使用了此处未描述的解决方案。我正在添加一个新的潜在解决方案,以帮助其他可能会跟随的人。

按照书面说明,此解决方案仅在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和主查询中,以试图消除这种不适当的行重复。

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