it-swarm.com.de

Übergeben mehrerer Werte an einzelne Parameter in gespeicherter Prozedur

Ich verwende SSRS zum Berichten und Ausführen einer gespeicherten Prozedur, um die Daten für meine Berichte zu generieren

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

Wenn ich @PortfolioId = '5,6' übergeben habe, werden mir falsche Eingaben gemacht 

Ich brauche alle Datensätze für portfolio id 5 and 6 also Ist dies die richtige Art, mehrere Werte zu senden?

Wenn ich meine Berichte nur mit @PortfolioId = '5' ausführe, gibt es mir 120 Datensätze Wenn ich sie mit @PortfolioId = '6' ausführe, gibt es mir 70 Datensätze

Wenn ich also @PortfolioId = '5,6' geben werde, sollte es mir nur 190 Datensätze geben müssen, aber es gibt mir mehr Datensätze. Ich verstehe nicht, wo ich genau schief gehe.

Könnte mir jemand helfen? Danke

enter image description here

der gesamte Code ist zu groß zum Einfügen. Ich füge relevanten Code ein.

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

Dies kann nicht leicht gemacht werden. Es gibt keine Möglichkeit, für einen NVARCHAR-Parameter "mehr als einen Wert" zu verwenden. Was ich zuvor gemacht habe, ist - wie Sie es bereits getan haben - den Parameterwert wie eine Liste mit durch Kommas getrennten Werten zu machen. Teilen Sie dann diese Zeichenfolge in der gespeicherten Prozedur in ihre Teile auf.

Die Aufteilung kann mit Stringfunktionen erfolgen. Fügen Sie jeden Teil einer temporären Tabelle hinzu. Pseudo-Code dafür könnte sein:

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

Ändern Sie dann Ihren Zustand in

WHERE PortfolioId IN (SELECT ID FROM #TempTable)

EDIT
Möglicherweise interessieren Sie sich für die Dokumentation zu Parametern mit mehreren Werten in SSRS, in der es heißt:

Sie können einen mehrwertigen Parameter für jeden Berichtsparameter definieren, der du erschaffst. Wenn Sie jedoch mehrere Parameterwerte übergeben möchten Zurück zu einer Datenquelle mithilfe der Abfrage die folgenden Anforderungen muss zufrieden sein:

Die Datenquelle muss SQL Server, Oracle, Analysis Services und SAP BI sein NetWeaver oder Hyperion Essbase.

Die Datenquelle kann keine gespeicherte Prozedur sein. Reporting Services macht das nicht die Übergabe eines mehrwertigen Parameterarrays an ein gespeichertes Verfahren.

Die Abfrage muss eine IN-Klausel verwenden, um den Parameter anzugeben.

Das habe ich hier gefunden .

10

Entweder eine Benutzerdefinierte Tabelle verwenden

Oder Sie können CSV verwenden, indem Sie Ihre eigene CSV-Funktion gemäß This Post definieren.

Ich würde wahrscheinlich die zweite Methode empfehlen, da Ihre gespeicherte Prozedur bereits im korrekten Format geschrieben ist und Sie sich später als nützlich erweisen werden, wenn Sie dies später tun müssen. 

Prost!

1
user1735181

Ich habe viel Zeit damit verbracht, einen richtigen Weg zu finden. Dies kann für andere nützlich sein.

Erstellen Sie eine UDF und verweisen Sie in der Abfrage -

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

1

Ich denke, das unten beschriebene Verfahren hilft Ihnen, wonach Sie suchen.

 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 ('[email protected]+')
    order by EmpId'
    Insert into @AnswersTempTable
    exec (@sqlQuery)
    select * from @AnswersTempTable
    END
1
Hitesh Bhatt

BENUTZE DAS

Ich hatte dieses genaue Problem seit fast zwei Wochen, extrem frustrierend, aber ich fand diese Seite ENDLICH und es war ein klarer Schritt durch das, was zu tun ist.

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

Ich hoffe, das hilft den Leuten, weil es genau das war, wonach ich gesucht habe

1
gruff