web-dev-qa-db-fra.com

Comment passer plusieurs valeurs à un paramètre unique dans une procédure stockée

J'utilise SSRS pour la création de rapports et l'exécution d'une procédure stockée afin de générer les données pour mes rapports.

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

Dans ce qui précède, lorsque j'ai passé @PortfolioId = '5,6', cela me donne de mauvaises entrées 

J'ai besoin de tous les enregistrements pour portfolio id 5 and 6 also. Est-ce la bonne façon d'envoyer les multiples valeurs?

Lorsque j'exécute mes rapports en ne donnant que @PortfolioId = '5', cela me donne 120 enregistrements Et lorsque je l'exécute en donnant @PortfolioId = '6', je m'en donne 70

Donc, quand je donnerai @PortfolioId = '5,6', il ne devrait me donner que 190 enregistrements au total, mais cela ne me donne plus aucun enregistrement que je ne comprends pas où je me trompe.

Quelqu'un pourrait-il m'aider?

enter image description here

tout le code est trop énorme pour être collé, je suis en train de coller du code pertinent, s'il vous plaît.

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

Cela ne peut pas être fait facilement. Il n'y a aucun moyen de faire en sorte qu'un paramètre NVARCHAR prenne "plus d'une valeur". Ce que j'ai déjà fait est, comme vous le faites déjà, de définir le paramètre comme une liste de valeurs séparées par des virgules. Ensuite, divisez cette chaîne en ses parties dans la procédure stockée.

La scission peut être effectuée à l'aide de fonctions de chaîne. Ajouter chaque partie à une table temporaire. Le pseudo-code pour cela pourrait être:

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

Ensuite, changez votre condition pour

WHERE PortfolioId IN (SELECT ID FROM #TempTable)

MODIFIER
La documentation pour les paramètres à valeurs multiples dans SSRS pourrait vous intéresser:

Vous pouvez définir un paramètre à valeurs multiples pour tout paramètre de rapport qui tu crées. Toutefois, si vous souhaitez transmettre plusieurs valeurs de paramètre Retour à une source de données à l'aide de la requête, les exigences suivantes doit être satisfait:

La source de données doit être SQL Server, Oracle, Analysis Services, SAP BI NetWeaver ou Hyperion Essbase.

La source de données ne peut pas être une procédure stockée. Reporting Services fait le supporte pas le passage d’un tableau de paramètres à valeurs multiples à un .__ stocké. procédure.

La requête doit utiliser une clause IN pour spécifier le paramètre.

Ce que j'ai trouvé ici .

10
Thorsten Dittmar

Soit utiliser un User Defined Table

Ou vous pouvez utiliser CSV en définissant votre propre fonction CSV comme indiqué dans Ce message .

Je recommanderais probablement la deuxième méthode, car votre proc stocké est déjà écrit dans le format correct et vous le retrouverez plus tard si vous avez besoin de le faire plus tard. 

À votre santé!

1
user1735181

J'ai passé du temps à trouver le bon chemin. Cela peut être utile pour les autres.

Créer un fichier UDF et faire référence à la requête -

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

1
Soumyendra Sharma

Je pense que la procédure ci-dessous vous aide à trouver ce que vous recherchez.

 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

UTILISEZ CECI

Cela fait presque deux semaines que je suis confronté à ce problème, extrêmement frustrant, mais j'ai finalement trouvé ce site, qui expliquait clairement ce qu'il fallait faire.

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

J'espère que cela aide les gens parce que c'était exactement ce que je cherchais

1
gruff