Come passare i caratteri a più valori nel rapporto SSRS?


8

Ho un rapporto SSRS che ha 3 set di dati che alimentano una fonte di dati. Il set di dati principale è una procedura memorizzata che sta aggregando alcuni dati in base a una serie di parametri alimentati dagli altri due set di dati.

La principale procedura memorizzata che alimenta questo rapporto ha 4 parametri. Uno è un ID per il tipo di dati, due sono per le date di inizio e fine e il terzo è solo un parametro flag. Il parametro flag è il parametro multivalore in cui desidero passare più valori flag che sono anche valori VARCHAR.

Nella mia procedura memorizzata per il mio parametro @Flag, ho il comune:

WHERE [Flag] IN (@Flag)

Quindi, naturalmente, il parametro @Flag nel report SSRS impostato per consentire "Valori multipli" che vengono anche popolati da una query che sta estraendo quei valori @Flag da una tabella di dimensioni.

Il mio problema

Nella maggior parte dei casi quando si ha a che fare con i valori INT, utilizzare la stessa tecnica funziona. Tuttavia, quando ho a che fare con i valori dei personaggi, fallisce. Se scelgo una bandiera, il rapporto funziona magicamente. Se seleziono più di un flag, non sembra passare correttamente i flag alla procedura memorizzata e non vengono restituiti risultati.

Durante il test del flag multi-valore direttamente nella procedura memorizzata:

WHERE [Flag] IN ('A', 'B', 'C')

La procedura memorizzata funziona correttamente. Quindi il problema non è la procedura memorizzata, ma il modo in cui SSRS sta passando i valori multivalore al parametro @Flag.

Soluzioni provate

Ho provato a fare le seguenti modifiche al set di dati SSRS per questi parametri @Flag:

=join(Parameters!<your param name>.Value,",")

E anche questo:

=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")

Funzionano tutti su valori singoli, ma mai su più valori.

Cosa mi sto perdendo qui?

Risposte:


7

Ho trovato una soluzione Non ho diviso correttamente i valori nella procedura memorizzata con un UDF.

Per passare correttamente più valori in questa procedura memorizzata, dovrei aggiungere il seguente codice al parametro del set di dati che sto usando:

=join(Parameters!<your param name>.Value,",")

Fondamentalmente questo unirà più valori in un array e lo farà passare attraverso il @Flagparametro. Il passaggio successivo è l'aggiunta di SQL alla procedura memorizzata per ricevere e digerire correttamente i valori in modo che legga i valori con la INclausola.

Google cerca qualsiasi parser di stringhe UDF online. Ce ne sono molti tra cui scegliere. Ho usato dba_parseString_udfda Michelle Ufford http://sqlfool.com .

Dopo aver installato il mio UDF, ora posso modificare la mia INclausola per ricevere il nuovo parametro multivalore passato da SSRS come segue:

WHERE [Flag] IN (SELECT * FROM dba_parseString_udf(@Flag, ','))

Pertanto, SSRS passerà il seguente valore:

@Flag = 'A,B,C'

Quindi il mio UDF analizzerà correttamente quella stringa per:

A
B
C

E popolare il mio @Flagparametro correttamente conSELECT * FROM UDF()...


Nel caso questo aiuti chiunque altro: l'espressione join ( =join(Parameters!<your param name>.Value,",")) può essere aggiunta al set di dati leggendo il parametro, nella scheda "Parametri": c'è un pulsante "fx" per aggiungere espressioni, a destra della goccia "Valore parametro" -giù.
Doug_Ivison,

Inoltre, invece di creare un UDF da analizzare, se il valore del database e i valori dei parametri sono affidabili in modo univoco e non sono mai sottoinsiemi l'uno dell'altro, salto l'analisi e utilizzo semplicemente CHARINDEX: ad esempio, se il codice per leggere il parametro in SQL incorporato era : WHERE <Table>.[<Column>] IN (@MultiValueParm), quindi il codice nella procedura memorizzata potrebbe essereWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison

Grandi domande, grazie! Cordiali saluti, SQLFool.com sembra essere inattivo. La funzione ParseString () è disponibile all'indirizzo: github.com/MichelleUfford/sql-scripts/blob/master/dev/…
J Weezy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.