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

时间:2012-12-07 13:25:09

标签: sql sql-server ssrs-2008 reporting-services

我正在使用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

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

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

当我执行仅提供@PortfolioId = '5'的报告时,它会给我120条记录 当我通过给予@PortfolioId = '6'执行它时,它给了我70条记录

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

有人能帮帮我吗? 感谢

enter image description here

所有代码都太大而无法粘贴,我正在粘贴相关代码,请提示线索。

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, ',')                                             )

5 个答案:

答案 0 :(得分:10)

这不容易做到。没有办法让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

然后,将您的条件更改为

WHERE PortfolioId IN (SELECT ID FROM #TempTable)

修改
您可能对SSRS中多值参数的文档感兴趣,其中指出:

  

您可以为任何报告参数定义多值参数   你创造。但是,如果要传递多个参数值   通过使用查询返回数据源,具有以下要求   必须满意:

     

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

     

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

     

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

This I found here

答案 1 :(得分:2)

使用这个

我已经有了近两个星期的确切问题,非常令人沮丧,但我最终找到了这个网站,这是一个明确的步骤,了解该怎么做。

http://blog.summitcloud.com/2010/01/multivalue-parameters-with-stored-procedures-in-ssrs-sql/

我希望这有助于人们,因为它正是我所寻找的

答案 2 :(得分:1)

使用User Defined Table

或者您可以按照This Post定义自己的CSV功能来使用CSV。

我可能会推荐第二种方法,因为你的存储过程已经以正确的格式编写,如果你需要在未来的路上这么做,你会发现它很方便。

干杯!

答案 3 :(得分:1)

我认为,以下程序可以帮助您找到您想要的内容。

 CREATE PROCEDURE [dbo].[FindEmployeeRecord]
        @EmployeeID nvarchar(Max)
    AS
    BEGIN
    DECLARE @sqLQuery VARCHAR(MAX)
    Declare @AnswersTempTable Table
    (  
        EmpId int,         
        EmployeeName nvarchar (250),       
        EmployeeAddress nvarchar (250),  
        PostalCode nvarchar (50),
        TelephoneNo nvarchar (50),
        Email nvarchar (250),
        status nvarchar (50),  
        Sex nvarchar (50) 
    )

    Set @sqlQuery =
    'select e.EmpId,e.EmployeeName,e.Email,e.Sex,ed.EmployeeAddress,ed.PostalCode,ed.TelephoneNo,ed.status
    from Employee e
    join EmployeeDetail ed on e.Empid = ed.iEmpID
    where Convert(nvarchar(Max),e.EmpId) in ('+@EmployeeId+')
    order by EmpId'
    Insert into @AnswersTempTable
    exec (@sqlQuery)
    select * from @AnswersTempTable
    END

答案 4 :(得分:1)

我花了一些时间寻找正确的方法。这可能对其他人有用。

创建UDF并引用查询-

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