2013-12-18 57 views
1

我在SSRS 2008 R2/BIDS中有一個報告。 其中一個參數是一個多選文本,例如名稱,我從存儲過程中獲取值。用戶選擇一個或多個這些值。如何有效地將多選SSRS 2008參數傳遞給存儲過程

然後我調用另一個存儲過程來獲取報表的數據,並將參數名稱選作參數傳遞給存儲過程@p_names

在該存儲過程中,我選擇記錄WHERE CHARINDEX(fName,@p_names) > 0。換句話說,我發現記錄的名字在參數字符串中。

的明顯的問題是,如果例如,這些值是:

並且用戶選擇

  • 瑪麗
  • 瑪麗喬
  • 愛德華
  • Cindy

然後我的CHARINDEX選擇將返回喬,瑪麗,瑪麗喬和愛德華,當時只用通緝瑪麗喬和愛德華。

  • 瑪麗·喬·
  • 愛德華

我應該如何傳遞multichoice參數的存儲過程,我應該如何構建我的WHERE條款?

謝謝。

+0

穆罕默德阿里,我不想和你開始一場拳擊比賽......但是現在我覺得這篇文章的可讀性較差。 – Amarundo

+0

我也不是一個拳擊手:),但它的一個指揮實踐,使你'數據'或'代碼'從你的問題的文字脫穎而出。那是所有:) –

+0

關於數據你是絕對正確的。感謝那。我會繼續記住這一點。我指的是「用戶選擇」應在2個數據項之前進行,然後「我的CHARINDEX選擇將返回...」應該在2個數據項之後。 – Amarundo

回答

1

這應該完全匹配工作,而無需拆分:

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

但是,如果你有大的列表可以使用分割方法有更好的表現。

+0

這是完美的。在我問到這個問題後,我自己也找到了一個類似的方法,但我在BIDS中用','來包裝@p_names。我沒有想到你的做法是在SP中做所有事情。好多了。我會改變我的。大。 – Amarundo

2

右Amarundo有對此沒有簡單的解決方案,當你讓 多個值被傳遞到你的報表參數,它實際上 通過他們的逗號Deliminated字符串值的數據集查詢/存儲過程。

要 使其工作,你將需要兩個東西

1)創建其 接受一個逗號Deliminated字符串,分裂他們的功能。

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 

修改你strored過程是這樣的

存儲過程

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

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

END 
GO 
相關問題