2012-12-07 8 views
6

sto utilizzando SSRS per la segnalazione e l'esecuzione di una stored procedure per generare i dati per i miei rapportiCome passare più valori a singolo parametro nella stored procedure

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 

In precedenza, quando ho superato @PortfolioId = '5,6' sta dando ingressi errati

Ho bisogno di tutti i record per portfolio id 5 and 6 also è questo modo corretto per inviare più valori?

Quando eseguo i miei rapporti solo dando @PortfolioId = '5' mi sta dando 120 record e quando ho eseguirlo dando @PortfolioId = '6' mi sta dando 70 record

Così, quando darò @PortfolioId = '5,6' dovrebbe avere per dare solo a me 190 record del tutto, ma mi sta dando più no di record che non capisco dove sbaglio esattamente.

Qualcuno potrebbe aiutarmi? grazie

enter image description here

tutto il codice è troppo grande per incollare, sto incollando il codice in questione si prega di suggerire indizio.

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

ci mostri la firma ** ** della stored procedure (quali nomi e tipi di dati sono i parametri), e come si usa quel parametro '@ PortfolioId' nella procedura memorizzata? –

+0

Hi marc_s in realtà sto usando SSRS che riporta sul rapporto Ho elenco a discesa con tutti i nomi di portafoglio con la casella di controllo. dove posso selezionare più portfolio allo stesso tempo, quindi passerà alla procedura sopra come se non sbaglio. allora perché sto ricevendo più no di record invece di 5 e 6 portafogli – Neo

+0

mia procedura Codice aggiunto – Neo

risposta

8

Questo non può essere fatto facilmente. Non c'è modo di fare un parametro NVARCHAR prendere "più di un valore". Quello che ho fatto prima è - come fai già - rendere il valore del parametro come un elenco con valori separati da virgole. Quindi, suddividere questa stringa nelle sue parti nella stored procedure.

La suddivisione può essere eseguita utilizzando le funzioni di stringa. Aggiungi ogni parte a una tabella temporanea. Pseudo-codice per questo potrebbe essere:

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 

Quindi, cambiare la sua condizione di

WHERE PortfolioId IN (SELECT ID FROM #TempTable) 

EDIT
Potreste essere interessati nella documentazione per i parametri multipli di valore in SSRS, in cui si afferma:

È possibile definire un parametro multivalore per qualsiasi parametro del rapporto creato da . Tuttavia, se si desidera passare il parametro più valori ad una fonte dati utilizzando la query, i seguenti requisiti devono essere soddisfatte:

L'origine dati deve essere SQL Server, Oracle, Analysis Services, SAP BI NetWeaver o Hyperion Essbase.

L'origine dati non può essere una stored procedure. Reporting Services non supporta per passare una matrice di parametri multivalore a una procedura memorizzata .

La query deve utilizzare una clausola IN per specificare il parametro.

This I found here.

+0

Ciao in realtà sto usando SSRS che riporta sul rapporto Ho un elenco a discesa con tutti i nomi di portafoglio con la casella di controllo. dove posso selezionare più portfolio allo stesso tempo, quindi passerà alla procedura sopra come se non sbaglio. allora perché sto ottenendo più no di record invece di 5 e 6 portafogli – Neo

+0

Sei sicuro che il parametro sia passato come ritieni che sia? Sarebbe interessante vedere il codice per la stored procedure per rispondere. –

+0

Si prega di notare la mia modifica sui parametri multi valore. –

1

utilizzare un User Defined Table

oppure è possibile utilizzare CSV definendo la propria funzione CSV come da This Post.

Probabilmente suggerirei il secondo metodo, poiché il proc memorizzato è già scritto nel formato corretto e lo troverai utile in seguito se è necessario farlo in futuro.

Cheers!

+0

la mia procedura Codice aggiunto – Neo

1

Penso che la procedura seguente ti aiuti a ciò che stai cercando.

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 
+0

Un collegamento a una potenziale soluzione è sempre il benvenuto, ma per favore [aggiungi contesto intorno al link] (http://meta.stackoverflow.com/a/8259/169503) così i tuoi compagni gli utenti avranno un'idea di cosa sia e perché è lì. Citare sempre la parte più rilevante di un link importante, nel caso in cui il sito target non sia raggiungibile o sia permanentemente offline. Considera che essere _barely più di un link a un sito esterno_ è una possibile ragione per [Perché e come vengono eliminate alcune risposte?] (Http://stackoverflow.com/help/deleted-answers). –

+2

Nota anche la [stessa risposta] (http://stackoverflow.com/a/17590687/851811) è stata pubblicata (e cancellata) quasi un anno fa. È giusto collegarsi al tuo blog o sito se è pertinente alla domanda, ma tieni presente che è conveniente che una risposta valga da sola senza bisogno di andare su un sito esterno. Sarebbe anche bello esplicitare la tua relazione con il sito, se presente. –

+1

Mi piacerebbe andare più lontano di "conveniente" e dire che è un prerequisito perché le risposte contengano abbastanza informazioni per rispondere alla domanda senza dover seguire i collegamenti. I collegamenti dovrebbero essere di riferimento o di attribuzione, non la risposta stessa. – indivisible