Gespeicherte Funktion mit mehreren Abfragen und verschiedenen ausgewählten Spalten

8

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?

    
Shmewnix 19.01.2017, 11:20
quelle

6 Antworten

7

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%     
Vasyl Zvarydchuk 30.01.2017, 19:21
quelle
0

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 :

%Vor%

Dann in der Berichterstattung muss ich pivot Operation wieder durchführen. Dies ist eine Umgehung mit vielen Einschränkungen:

  • Die unpivot -Daten müssen in den größten Typ umgewandelt werden (normalerweise String)
  • unnötige Operationen werden ausgeführt ( pivot - & gt; unpivot ) anstatt nur die Daten zu rendern;
  • es funktioniert nicht gut mit großen Datenmengen (es ist langsam)

und andere ..

    
gotqn 31.01.2017 11:09
quelle
0

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%     
abdulla wasay 31.01.2017 11:20
quelle
0

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.

    
jambonick 31.01.2017 09:10
quelle
0

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%     
Steve Ford 31.01.2017 13:23
quelle
0
%Vor%     
Alfaiz Ahmed 02.02.2017 13:04
quelle

Tags und Links