众所周知,Microsoft Reporting Service 2008(简称RS)是一个轻量级客户端报表展示产品。本文是对该产品中【查询参数】的应用案例之一,主要内容是实现RS的多值参数查询。最终实现的效果图如下:
下面详细介绍背景、业务场景及实现过程。
-
背景。系统中记录了某公司所有【客户】的信息,并根据往来交易情况为每一个客户设定了【级别】{有效客户、重点客户、VIP客户},其中有一部分客户未设定级别,则为NULL。
-
业务场景。客户经理需要根据【客户级别】的不同值,过滤并查询客户信息,并且可以忽略【客户级别】查看所有客户。
-
具体实现。
关键点1.设置RS参数的数据类型为【允许多个值】。此时,该参数不支持NULL值,也就是在查询时必须选择参数列表中的一个值。
关键点2.当RS参数的数据类型为【允许多个值】时,其参数值为Object类型的数组,需要添加一个临时参数对数组进行处理,并在T-sql中使用该临时参数对客户进行筛选。
(一)向报表添加查询参数【客户级别】。
(二)设置【可用值】和【默认值】。此时,【默认值】为【全部】,为了实现业务场景中所述:忽略【客户级别】查询所有客户。
(三)新增临时参数【para】处理参数【客户级别】的值。步骤:新建参数,可用值为【无】、默认值为指定值=Join(Parameters!CustLevel.Value,",")
(四)创建函数ufn_SplitStrToTab,处理【para】,目的是拆分“,”分割的字符串。例如,【para】=“1,2,3”,则函数返回
(五)T-sql根据参数【para】查询客户信息。
2 FROM [ Customer ] C
3 WHERE C. Level IN ( SELECT * FROM dbo.ufn_SplitStrToTab( @para ))
4 OR EXISTS ( SELECT * FROM dbo.ufn_SplitStrToTab( @para ) WHERE Id = ' -1 ' )
(六)结果展示。
附: 上文中使用的SQLServer函数--ufn_SplitStrToTab
2 @Ids nvarchar ( 4000 )
3 )
4 RETURNS @tab TABLE (Id INT )
5 BEGIN
6
7 DECLARE
8 @Id nvarchar ( 4000 )
9 , @N int
10 , @N2 int
11
12 SET @N2 = 1
13 SET @N = 0
14 SET @Ids = @Ids + ' , '
15
16 WHILE @N <> len ( @ids )
17 BEGIN
18 SET @N = charindex ( ' , ' , @ids , @N2 )
19 SET @Id = substring ( @ids , @n2 , @N - @N2 )
20 INSERT INTO @tab VALUES ( CONVERT ( INT , @id ) )
21 SET @N2 = @N + 1
22 END
23 RETURN
24
25 END