Wie übergebe ich mehrwertige Zeichen in SSRS Report?

8

Ich habe einen SSRS-Bericht mit 3 Datensätzen, die von einer Datenquelle gespeist werden. Der Hauptdatensatz ist eine gespeicherte Prozedur, die einige Daten basierend auf einer Reihe von Parametern aggregiert, die von den beiden anderen Datensätzen unterstützt werden.

Die gespeicherte Hauptprozedur für diesen Bericht verfügt über 4 Parameter. Eine ist eine ID für den Datentyp, zwei sind für Start- und Enddaten und die dritte ist nur ein Flag-Parameter. Der Flag-Parameter ist der mehrwertige Parameter, bei dem ich mehrere Flag-Werte übergeben möchte, die auch VARCHAR-Werte sind.

In meiner gespeicherten Prozedur für meinen @ Flag-Parameter habe ich Folgendes:

WHERE [Flag] IN (@Flag)

Dann wird natürlich der Parameter @Flag im SSRS-Bericht so festgelegt, dass mehrere Werte zulässig sind, die auch aus einer Abfrage ausgefüllt werden, die diese @ Lag-Werte aus einer Dimensionstabelle abruft.

Mein Problem

In den meisten Fällen funktioniert beim Umgang mit INT-Werten dieselbe Technik. Wenn ich mich jedoch mit Zeichenwerten beschäftige, schlägt dies fehl. Wenn ich eine Flagge wähle, funktioniert der Bericht auf magische Weise. Wenn ich mehr als ein Flag auswähle, scheinen die Flags nicht korrekt an die gespeicherte Prozedur übergeben zu werden, und es werden keine Ergebnisse zurückgegeben.

Beim Testen des mehrwertigen Flags direkt in der gespeicherten Prozedur:

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

Die gespeicherte Prozedur funktioniert ordnungsgemäß. Das Problem ist also nicht die gespeicherte Prozedur, sondern wie SSRS die mehrwertigen Werte an den Parameter @Flag übergibt.

Lösungen ausprobiert

Ich habe versucht, die folgenden Anpassungen am SSRS-Dataset für diese @ Flag-Parameter vorzunehmen:

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

UND auch dieser:

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

Diese arbeiten alle mit einzelnen Werten, aber niemals mit mehreren Werten.

Was fehlt mir hier?

Anspruchsvoll
quelle

Antworten:

7

Ich habe eine Lösung gefunden. Ich habe die Werte in der gespeicherten Prozedur mit einer UDF nicht richtig aufgeteilt.

Um Mehrfachwerte in dieser gespeicherten Prozedur korrekt zu übergeben, müsste ich dem von mir verwendeten Datensatzparameter den folgenden Code hinzufügen:

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

Dadurch werden im Grunde mehrere Werte zu einem Array zusammengefügt und über den @FlagParameter übergeben. Der nächste Schritt ist das Hinzufügen von SQL zur gespeicherten Prozedur, um die Werte korrekt zu empfangen und zu verarbeiten, sodass die Werte mit der INKlausel gelesen werden .

Google durchsucht jeden UDF-String-Parser online. Es gibt viele zur Auswahl. Ich habe dba_parseString_udfvon Michelle Ufford http://sqlfool.com verwendet .

Nachdem ich meine UDF installiert hatte, kann ich jetzt meine INKlausel ändern , um den neuen mehrwertigen Parameter zu erhalten, der von SSRS wie folgt übergeben wird:

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

Daher übergibt SSRS den folgenden Wert:

@Flag = 'A,B,C'

Dann analysiert meine UDF diese Zeichenfolge korrekt auf:

A
B
C

Und füllen Sie meinen @FlagParameter korrekt mitSELECT * FROM UDF()...

Anspruchsvoll
quelle
Falls dies jemand anderem hilft: Der Join-Ausdruck ( =join(Parameters!<your param name>.Value,",")) kann dem Datensatz hinzugefügt werden, der den Parameter liest. Auf der Registerkarte "Parameter" befindet sich rechts neben dem Dropdown-Feld "Parameterwert" eine Schaltfläche "fx" zum Hinzufügen von Ausdrücken -Nieder.
Doug_Ivison
Anstatt eine UDF zum Parsen zu erstellen , überspringe ich das Parsen und verwende nur CHARINDEX , wenn der Datenbankwert und die Parameterwerte zuverlässig eindeutig sind und niemals Teilmengen voneinander sind. Zum Beispiel, wenn der Code zum Lesen des Parameters in eingebettetem SQL war : WHERE <Table>.[<Column>] IN (@MultiValueParm), dann könnte der Code in der gespeicherten Prozedur seinWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison
Tolle Fragen und Antworten, danke! Zu Ihrer Information , SQLFool.com scheint ausgefallen zu sein. Die ParseString () -Funktion finden Sie unter: github.com/MichelleUfford/sql-scripts/blob/master/dev/…
J Weezy