Suchen...
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Dynamisches SQL mit Ausgabeparameter

Dynamisches SQL erlaubt die Definition und Ausführung von SQL-Anweisungen zur Laufzeit. Teile der Anweisungen befinden sich in Variablen, die ihre Werte zur Laufzeit ändern können. So kann ein dynamisch erstelltes SQL-Statement bei Veränderung der Variablen immer wieder verwendet werden ohne neu erstellt werden zu müssen.

Jeder von uns hat sicher bereits dynamisches SQL entwickelt und verwendet. Seltener wird dabei ein Ausgabewert benötigt. Aber genau um den soll es in diesem Artikel gehen, da die Programmierung eines Ausgabewertes innerhalb eines dynamischen SQL-Statements bestimmten Regeln unterliegt.

Im Beispiel wird eine Prozedur zum Kopieren von Werten der Wertart 1 zu Wertart 2 bei definiertem Zeitpunkt und Kunden in der Datenbank Chair erstellt. Es wird dafür dynamisches SQL eingesetzt, weil sich die zu kopierenden Werte in mehreren Tabellen befinden. Dabei soll zuvor ermittelt werden, ob zu diesem Zeitpunkt und bei diesem Kunden bei der Wertart 1, die kopiert werden soll, überhaupt Daten vorliegen. Diese Anzahl Datensätze ist also der Ausgabewert, der für jede Tabelle ermittelt wird.

Nun wird die Prozedur erstellt. Sie soll als Übergabeparameter den gewünschten Monat, den Kunden, die Wertart 1, welche kopiert werden soll, und die Wertart 2, in die kopiert werden soll, enthalten. Außerdem werden zu Beginn alle erforderlichen Variablen deklariert.

Zunächst kann man in der Prozedur die Übergabeparameter auf Gültigkeit überprüfen. Das soll hier nicht weiter thematisiert werden und ist in dem vollständigen Skript der Prozedur enthalten, welches sich im Anhang dieses Blogs befindet.

Da das Kopieren für mehrere Tabellen durchgeführt werden soll, müssen diese zunächst ermittelt und eine Cursor-Variable deklariert werden:

Es werden alle Tabellen, die eine Spalte “Revenues” enthalten, mit “T_Import_” beginnen und nicht auf “_Log” oder “_Rollback” enden, selektiert. In der Datenbank Chair sind dies die Tabellen T_IMPORT_FACT und T_Import_Deckungsbeitragsrechnung.

Nun soll ermittelt werden, ob diese Tabellen zu dem in den Parametern angegebenem Zeitpunkt und Kunden aktuelle Werte vorliegen.

Dafür öffnen wir den zuvor definierten Cursor und selektieren den Namen der ersten Tabelle in eine Variable @Tabname.

Um die Anzahl der Datensätze zu ermitteln, wird folgendes dynamisches SQL erstellt:

Die Variable @AnzOut soll die Anzahl der Datensätze enthalten. Wurde ein spezieller Kunde als Paramater an die Prozedur übergeben, wird der Kunde in die WHERE-Bedingung aufgenommen, sonst werden alle Kunden in die Abfrage einbezogen.

Mit der Anweisung:

wird die @AnzOut als Ausgabeparameter definiert.

Ausgeführt wird das SQL-Statement über:

Ein einfaches Ausführen mit EXEC @SQL_Anz ist nicht möglich. Wichtig ist auch, dass sowohl die Variable für das SQL-Statement (@SQL_Anz) als auch die Variable für die Definition der Parameter (@ParamDef) vom Typ nvarchar sind.

Der eigentlich mit der Anzahl befüllte Parameter @AnzOut muss zudem in eine Variable (hier @Anz) kopiert werden, da es sich bei @AnzOut tatsächlich nur um einen Ausgabeparameter handelt, der nicht als Variable verwendet werden kann.

Mit der Variable @Anz kann nun die Entscheidung getroffen werden, ob Daten kopiert werden oder nicht.