如何将多个值传递给存储过程中的单个参数

Neo*_*Neo 11 sql sql-server reporting-services ssrs-2008

我正在使用SSRS报告和执行存储过程来为我的报告生成数据

DECLARE @return_value int

EXEC    @return_value = [dbo].[MYREPORT]
        @ComparePeriod = 'Daily',
        @OverrideCompareDate = NULL,
        @PortfolioId = '5,6',
        @OverrideStartDate = NULL,
        @NewPositionsOnly = NULL,
        @SourceID = 13

SELECT  'Return Value' = @return_value

GO
Run Code Online (Sandbox Code Playgroud)

在上面我通过@PortfolioId = '5,6'它时给了我错误的输入

我需要所有记录,portfolio id 5 and 6 also这是发送多个值的正确方法吗?

当我执行我的报告时,只给@PortfolioId = '5'它给我120条记录,当我通过给@PortfolioId = '6'它执行它给我70条记录

因此,当我给@PortfolioId = '5,6'它时,它应该只给我一共190条记录,但它给了我更多的记录,我不明白我哪里出错了.

谁能帮助我?谢谢

在此输入图像描述

所有代码都太大了无法粘贴,我粘贴相关代码请提示线索.

CREATE PROCEDURE [dbo].[GENERATE_REPORT]
(
    @ComparePeriod VARCHAR(10),
    @OverrideCompareDate DATETIME,
    @PortfolioId VARCHAR(50) = '2',   --this must be multiple 
    @OverrideStartDate DATETIME = NULL,
    @NewPositionsOnly BIT = 0,
    @SourceID INT = NULL

)  AS
BEGIN   
SELECT  
            Position.Date,
            Position.SecurityId,
            Position.Level1Industry,
            Position.MoodyFacilityRating, 
            Position.SPFacilityRating, 
            Position.CompositeFacilityRating, 
            Position.SecurityType,
            Position.FacilityType,
            Position.Position

        FROM
            Fireball_Reporting.dbo.Reporting_DailyNAV_Pricing POSITION WITH (NOLOCK, READUNCOMMITTED)
         LEFT JOIN Fireball.dbo.AdditionalSecurityPrice ClosingPrice WITH (NOLOCK, READUNCOMMITTED) ON
                    ClosingPrice.SecurityID = Position.PricingSecurityID AND
                    ClosingPrice.Date = Position.Date AND
                    ClosingPrice.SecurityPriceSourceID = @SourceID AND
                    ClosingPrice.PortfolioID IN (
                SELECT
                PARAM
                FROM
                Fireball_Reporting.dbo.ParseMultiValuedParameter(@PortfolioId, ',')                                             )
Run Code Online (Sandbox Code Playgroud)

Tho*_*mar 11

这不容易做到.没有办法让NVARCHAR参数采用"多个值".之前我所做的是 - 就像你已经做的那样 - 将参数值设置为带有逗号分隔值的列表.然后,将此字符串拆分为存储过程中的部分.

可以使用字符串函数完成拆分.将每个部件添加到临时表中.伪代码可以是:

CREATE TABLE #TempTable (ID INT)
WHILE LEN(@PortfolioID) > 0
BEGIN
    IF NOT <@PortfolioID contains Comma>
    BEGIN
        INSERT INTO #TempTable VALUES CAST(@PortfolioID as INT)
        SET @PortfolioID = ''
    END ELSE
    BEGIN
         INSERT INTO #Temptable VALUES CAST(<Part until next comma> AS INT)
         SET @PortfolioID = <Everything after the next comma>
    END
END
Run Code Online (Sandbox Code Playgroud)

然后,将您的条件更改为

WHERE PortfolioId IN (SELECT ID FROM #TempTable)
Run Code Online (Sandbox Code Playgroud)

编辑
您可能对SSRS中多值参数的文档感兴趣,其中说明:

您可以为您创建的任何报表参数定义多值参数.但是,如果要使用查询将多个参数值传递回数据源,则必须满足以下要求:

数据源必须是SQL Server,Oracle,Analysis Services,SAP BI NetWeaver或Hyperion Essbase.

数据源不能是存储过程.Reporting Services不支持将多值参数数组传递给存储过程.

查询必须使用IN子句指定参数.

这是我在这里找到的.


小智 5

我花了时间寻找合适的方法。这可能对其他人有用。

创建 UDF 并在查询中引用 -

http://www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm