如何有效地将多选SSRS 2008参数传递给存储过程

时间:2013-12-18 17:21:40

标签: sql-server sql-server-2008 tsql ssrs-2008

我在SSRS 2008 R2 / BIDS中有一份报告。 其中一个参数是多选文本,比如名称,我从存储过程中获取值。用户选择这些值中的一个或多个。

然后我调用另一个存储过程来获取报告的数据,并将带有选定名称的参数的参数传递给存储过程@p_names

在该存储过程中,我选择记录WHERE CHARINDEX(fName,@p_names) > 0。换句话说,我发现记录的第一个名字在参数字符串中。

显而易见的问题是,例如,如果值为:

用户选择

  
      
  •   
  • 玛丽
  •   
  • Mary Joe
  •   
  • 爱德华
  •   
  • 辛迪
  •   

然后我的CHARINDEX选择将返回Joe,Mary,Mary Joe和Edward,当使用者只想要Mary Joe和Edward时。

  
      
  • Mary Joe
  •   
  • 爱德华
  •   

我应该如何将multichoice参数传递给存储过程?我应该如何构造我的WHERE子句?

感谢。

2 个答案:

答案 0 :(得分:2)

  

正确的Amarundo当你允许时,没有简单的解决方案   实际上,要将多个值传递给报表参数   将Comma Deliminated字符串值传递给DataSet查询/存储过程。

     

要   让它工作你需要两件事

     

1)创建一个函数   接受逗号删除字符串并将其拆分。

     

2)修改你   存储过程并以通过的方式在此处添加此功能   参数传递给该存储过程内的函数   该函数在将值传递到商店之前将其拆分   程序。

创建此功能第1个

功能定义

CREATE FUNCTION [dbo].[FnSplit]
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table (Id int identity(1,1), Value nvarchar(100))
AS
BEGIN

WHILE(Charindex(@SplitOn,@List)>0)

  BEGIN


        INSERT INTO @RtnValue (value)

        SELECT VALUE = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))

        SET @List = SUBSTRING(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))

  END


INSERT INTO @RtnValue (Value)

SELECT VALUE = ltrim(rtrim(@List))

RETURN

END

修改你这样的程序

存储过程

CREATE Procedure usp_Multipleparameter (@Param1 VARCHAR(1000)= NULL)
AS
BEGIN

        SELECT * FROM TableName
        where ColumnNAME  IN (SELECT Value FROM dbo.FnSplit(@Param1,','))

END
GO

答案 1 :(得分:1)

这应该适用于完全匹配,而不必拆分:

WHERE CHARINDEX(',' + fName + ',',',' + @p_names + ',') > 0

但是,如果您有大型列表,则使用拆分方法可能会有更好的性能。