2009-08-10 75 views
15

我正在使用包含少量參數的存儲過程的SSRS報告。我有兩個參數有問題,因爲我想要選擇多個項目。使用存儲過程的SSRS多值參數

這裏是什麼,我有一個濃縮版:

CREATE PROCEDURE [dbo].[uspMyStoredProcedure] 
    (@ReportProductSalesGroupID AS VARCHAR(MAX) 
    ,@ReportProductFamilyID AS VARCHAR(MAX) 
    ,@ReportStartDate AS DATETIME 
    ,@ReportEndDate AS DATETIME) 

--THE REST OF MY QUERY HERE WHICH PULLS ALL OF THE NEEDED COLUMNS 

WHERE DateInvoicedID BETWEEN @ReportStartDate AND @ReportEndDate 
AND ProductSalesGroupID IN (@ReportProductSalesGroupID) 
AND ProductFamilyID IN (@ReportProductFamilyID) 

當我嘗試只是運行存儲過程,如果我的@ReportProductSalesGroupID和值1 @ReportProductFamilyID只輸入1個值,我只返回值。如果我嘗試輸入兩個SalesGroupID和/或2 ProductFamilyID它不會出錯,但我什麼都不返回。

-- Returns data 
EXEC uspMyStoredProcedure 'G23',  'NOF',  '7/1/2009', '7/31/2009' 

-- Doesn't return data 
EXEC uspMyStoredProcedure 'G23,G22', 'NOF,ALT', '7/1/2009', '7/31/2009' 

在SSRS我得到一個錯誤,指出:

附近有語法錯誤「」

看來,被列入字符串,而不是分隔符在,分離器

+0

您可以使用: - 動態SQL - 表值用戶定義函數請參閱[此鏈接的詳細信息](http://www.sql-server-helper.com/functions/comma-delimited-to-table。 ASPX)。 – 2009-08-10 20:15:40

+0

另外,這是一個關於http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause的關閉副本特別是大衛羅賓斯的解決方案看起來不錯。 – 2009-08-10 20:15:09

+0

好吧,我這樣做,它運作,如果我運行EXEC uspMyStoredProcedure'G23,G22','NOF,ALT','8/1/2009','8/9/2009' 但是,只要我嘗試它在rs中並從下拉列表中選擇多個值(從數據集生成)我在''附近得到不正確的語法 不知道我在丟什麼 – user153949 2009-08-10 21:31:19

回答

29

您需要三件事:

  1. 在SSRS數據集屬性,通過多值參數去存儲過程作爲一個逗號分隔的字符串

    =Join(Parameters!TerritoryMulti.Value, ",") 
    
  2. 在SQL Server中,你需要一個表值函數,可以拆分逗號-delimited串退了出來變成一個迷你表(例如see here

  3. 在存儲過程中,有一個where子句是這樣的:

    WHERE sometable.TerritoryID in (select Item from dbo.ufnSplit(@TerritoryMulti,',')) 
    

    ...其中ufnSplit是步驟的劃分功能2.

(在我的博客文章「SSRS multi-value parameters with less fail」具體步驟和代碼):

6

讓我們假設你有一個多值列表@param1

你的SSRS報告創建另一個內部參數叫做@param2和默認值設置爲:

=Join(Parameters!param1.value, 'XXX') 

XXX可以是任何你想要的分隔符,除了逗號(見下文)

然後,你可以將@param2傳遞給你的查詢或存儲過程。

如果試圖以任何其他方式執行此操作,它將導致使用逗號分隔參數的任何字符串函數失敗。 (例如CHARINDEX,REPLACE)。

例如Replace(@param2, ',', 'replacement')將不起作用。你最終會出現像「替換函數需要3個參數」的錯誤。

+1

逗號適合我,請參閱http://stackoverflow.com/a/9862901/22194 – codeulike 2014-06-29 15:14:16

1

最後,我得到了一個簡單的解決方案,解決了這個問題。下面我提供了我遵循的所有(3)個步驟。

我希望你們會喜歡:)

第1步 - 我創建了一個全局臨時表與一列。

CREATE GLOBAL TEMPORARY TABLE TEMP_PARAM_TABLE(
    COL_NAME VARCHAR2(255 BYTE) 
) ON COMMIT PRESERVE ROWS NOCACHE; 

第2步 - 在分裂過程,我沒有使用任何數組或數據表,我已經直接加載拆分值進入我的全局臨時表。

CREATE OR REPLACE PROCEDURE split_param(p_string IN VARCHAR2 ,p_separator IN VARCHAR2 
) 
IS 
    v_string VARCHAR2(4000); 
    v_initial_pos NUMBER(9) := 1; 
    v_position NUMBER(9) := 1; 
BEGIN 
    v_string := p_string || p_separator; 

    delete from temp_param_policy; 

    LOOP 
     v_position := 
        INSTR(v_string, p_separator, v_initial_pos, 1); 
     EXIT WHEN(NVL(v_position, 0) = 0); 

     INSERT INTO temp_param_table 
      VALUES (SUBSTR(v_string, v_initial_pos 
         , v_position - v_initial_pos)); 

     v_initial_pos := v_position + 1; 
    END LOOP; 
commit; 

END split_param; 
/

步驟3 - 在SSRS數據集參數中,我使用

=Join(Parameters!A_COUNTRY.Value, ",") 

步驟4:在存儲過程的開始執行程序

Exec split_param(A_Country, ‘,’); 

步驟5:在你的存儲過程sql使用如下的條件。

Where country_name in (select * from TEMP_PARAM_TABLE) 
0

當SSRS傳遞參數時,它的格式如下:參數1,參數2,參數3。

在該過程中,您只需將標識符放在每個參數的周圍。還有數據集返回值的標識符。在我的情況下,我用分號。

CREATE OR REPLACE PROCEDURE user.parameter_name ( i_multivalue_parameter ) AS l_multivalue_parameter varchar2(25555) := ';' || replace(i_multivalue_parameter,',',';') || ';'; BEGIN select something from dual where ( instr(l_multivalue_parameter, ';' || database_value_that_is_singular || ';') > 0 ) END;

i_multivalue_parameter通過SSRS傳遞英寸

l_multivalue_parameter讀取通過SSRS傳入的參數,並將標識符放在每個值的周圍。

database_value_that_is_singular是每個記錄返回的值。

因此,如果「類型1,類型2,Type3'is通過在經由SSRS:

i_multivalue_parameter是:類型1,類型2,類型3

l_multivalue_parameter是:;類型1; 2型;類型3;

database_value_that_is_singular is:; Type1;或; Type2;或; Type3;

如果參數匹配,Instr將返回大於0的值。

即使每個參數都是相似的,它也能正常工作。 EG:「A型」和「AA型」。即「Type A」與「Type AA」不符。

+0

當你說「標識符」時,你的意思是「分隔符」嗎? (或「分隔符」?)另外,您的答案看起來像是Oracle PL/SQL過程,而問題似乎是關於SQL Server T/SQL過程的? – criticalfix 2017-01-30 23:32:07

相關問題