2009-08-10 74 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

相关问题