我在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
子句?
感谢。
答案 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
但是,如果您有大型列表,则使用拆分方法可能会有更好的性能。