在 SqlServer Reporting Services 查询中合并'like'和'in'?



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

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

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

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

选项1

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

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

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

 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代码集。我认为这太过分了,充其量也是一个糟糕的选择,但它可以发挥作用。

你试过做吗:

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

Dano,您正在使用哪个版本的SSRS?如果是RS2000,则多参数列表为不受官方支持,但有一个变通办法。。。。

这样放:

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

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

正如所写的,此解决方案仅适用于SQL Server 2016及更高版本,但可以通过编写自定义字符串_拆分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 + '%'

如果有人多次添加同一个搜索词,这将导致结果集中的行重复。类似地,单个产品可以匹配多个搜索词。我在SearchTerms CTE和主查询中都添加了distinct,试图抑制这种不适当的行重复。

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

相关内容

  • 没有找到相关文章

最新更新