web-dev-qa-db-ja.com

ストアドプロシージャの単一のパラメーターに複数の値を渡す方法

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

これは簡単にはできません。 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)

[〜#〜] edit [〜#〜]
SSRSの複数値パラメーターのドキュメントに興味があるかもしれません。

作成するレポートパラメーターには、複数値パラメーターを定義できます。ただし、クエリを使用して複数のパラメーター値をデータソースに戻す場合は、次の要件を満たす必要があります。

データソースは、SQL Server、Oracle、Analysis Services、SAP BI NetWeaver、またはHyperion Essbaseである必要があります。

データソースをストアドプロシージャにすることはできません。Reporting Servicesは、ストアドプロシージャへの複数値パラメータ配列の受け渡しをサポートしていません。

クエリでは、IN句を使用してパラメーターを指定する必要があります。

これは私がここで見つけた

11

ユーザー定義テーブル を使用する

または、 この投稿 に従って独自のCSV関数を定義することにより、CSVを使用できます。

ストアドプロシージャは既に正しい形式で記述されているので、2番目の方法をお勧めします。これを後で行う必要がある場合は、後で便利になります。

乾杯!

2
user1735181

これを使って

私はこの正確な問題をほぼ2週間にわたって抱えていましたが、非常にイライラしていましたが、このサイトを最終的に見つけ、何をすべきかを明確に説明しました。

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

これがまさに私が探していたものだったからです。

2
gruff

適切な方法を見つけるのに時間を費やしました。これは他の人にとって役に立つかもしれません。

UDFを作成し、クエリで参照します-

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

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
1
Hitesh Bhatt