使用存储过程的SSRS多值参数

use*_*949 21 reporting-services

我正在研究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)
Run Code Online (Sandbox Code Playgroud)

当我尝试只运行存储过程时,如果我只为1 @ReportProductSalesGroupID和1 输入值,则只返回值@ReportProductFamilyID.如果我尝试输入两个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'
Run Code Online (Sandbox Code Playgroud)

在SSRS中,我收到一条错误消息:

','附近的语法不正确

看来,分隔符包含在字符串中而不是分隔符中

cod*_*ike 40

你需要三件事:

  1. 在SSRS数据集属性中,将多值param作为逗号分隔的字符串传递给存储过程

    =Join(Parameters!TerritoryMulti.Value, ",")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在Sql Server中,您需要一个表值函数,可以将逗号分隔的字符串拆分回迷你表(例如,请参见此处)

  3. 在存储过程中,有一个where子句,如下所示:

    WHERE sometable.TerritoryID in (select Item from dbo.ufnSplit(@TerritoryMulti,','))
    
    Run Code Online (Sandbox Code Playgroud)

    ... STRING_SPLIT你在步骤2中的分裂功能在哪里.

(我的博客中的完整步骤和代码发布' SSRS多值参数,失败少 '):

  • 在 SQLServer 中,您可以使用:`SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sat amet.', ' ');` (2认同)

小智 6

我们假设您有一个多值列表 @param1

在您的SSRS报告上创建另一个内部参数@param2,并将默认值设置为:

=Join(Parameters!param1.value, 'XXX')
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以传递@param2给您的查询或存储过程.

如果您尝试以任何其他方式执行此操作,则会导致使用逗号分隔参数的任何字符串函数失败.(例如CHARINDEX,REPLACE).

例如,Replace(@param2, ',', 'replacement')将无法正常工作.最终会出现"替换函数需要3个参数"之类的错误.