Ich habe eine Reihe von Abfragen basierend auf einem Berichtstyp. Zur Vereinfachung hier ist ein Beispiel für das, was ich versuche zu tun:
%Vor%Sie werden feststellen, dass ich drei separate Abfragen basierend auf dem zu übergebenden Berichtstyp ausgeführt habe. Sie werden auch bemerken, dass ich verschiedene Spalten und die Anzahl der Spalten zurückgebe.
Ich möchte dies zu einer gespeicherten Funktion machen und die Spalten, die ich benötige, basierend auf dem Berichtstyp, den ich passiere, zurückgeben. Ich weiß jedoch, dass die Anzahl der Spalten und die Spaltennamen unterschiedlich sind - das wird nicht als gespeicherte Funktion funktionieren, wie ich es möchte.
Das Hauptproblem besteht darin, diese Informationen zu melden - ich möchte keine separaten Funktionen haben, weil ich für jeden Berichtstyp unterschiedliche Berichte führen muss.
Gibt es einen Weg, wie ich das schaffen kann?
Sie können die Funktion für mehrere Anweisungen verwenden, aber Sie müssen alle Spalten angeben, die von 3 SELECT-Anweisungen zurückgegeben werden. Es scheint unmöglich zu sein, mehrere Ergebnismengen zurückzugeben.
Benutzerdefinierte Funktionen können nicht mehrere Ergebnismengen zurückgeben. Benutze einen gespeicherte Prozedur, wenn Sie mehrere Ergebnismengen zurückgeben müssen. Ссылка
Dies ist eine Unannehmlichkeit, aber im Bericht können Sie nur Spalten verwenden, die Sie brauchen, andere werden Nullen sein.
%Vor%So können Sie die Funktion auf diese Weise aufrufen
%Vor% Wenn Sie die gespeicherte Prozedur nicht verwenden können und Sie eine Funktion verwenden müssen, können Sie UNPIVOT
die Daten und dann% client side
können Sie PIVOT
it.
Ich muss so etwas tun, wenn eine andere Anzahl von Spalten in SQL Server Reporting Services
report zurückgegeben wird. Der folgende Code gibt beispielsweise immer drei Spalten zurück: RowID
, Column
, Value
:
Dann in der Berichterstattung muss ich pivot
Operation wieder durchführen. Dies ist eine Umgehung mit vielen Einschränkungen:
unpivot
-Daten müssen in den größten Typ umgewandelt werden (normalerweise String) pivot
- & gt; unpivot
) anstatt nur die Daten zu rendern; und andere ..
Für Dies können Sie eine skalare Wertfunktion erstellen, die eine XML-Typ-Spalte zurückgibt, und dann können Sie diese XML-Tag-Werte in Ihren Berichtsbildschirm einfügen
%Vor%In SQL ist es schwierig, etwas Ähnliches zu erzeugen, so generisch oder abstrakt, besonders wenn es um SELECT von Spalten geht. Wenn Ihr Zweck darin besteht, so wenig Code wie möglich zu schreiben, damit Ihr SQL-Skript leicht gepflegt werden kann und in der Zukunft neue Berichtstypen mit nur geringfügigen Änderungen hinzugefügt werden können, würde ich vorschlagen, eine gespeicherte Prozedur mit dynamischem SQL zu verwenden. Sie können eine Funktion nicht verwenden, während Sie SELECT als dynamisch empfinden, das ist die falsche Methode. Ich würde so etwas schreiben
%Vor%Und Sie werden es als
bezeichnen %Vor%zum Beispiel Mit diesem Code müssen Sie jedes Mal, wenn Sie einen neuen Berichtstyp wünschen, nur eine weitere Zeile hinzufügen, falls die angeforderten Spaltennamen vorhanden sind. Ich habe diesen Weg bei der Arbeit mit Crystal Reports genutzt und denke, dass dies die bestmögliche Lösung ist.
Wenn Sie Stored Procedures verwenden können, dann würde ich zur Wartbarkeit eine gespeicherte Masterprozedur verwenden, die andere Stored Procedures aufruft, um unterschiedliche Resultsets zurückzugeben:
%Vor%Und zu verwenden:
%Vor%Tags und Links sql sql-server sql-server-2008