Database
 sql >> Datenbank >  >> RDS >> Database

Übergeben der Datentabelle als Parameter an gespeicherte Prozeduren

Echte Datenbankanwendungen müssen mehrere Anfragen vom Frontend an die Datenbank stellen, um alle möglichen Funktionen auszuführen.

Wenn eine Anwendung datenintensiv ist, wie sie beispielsweise in Banken oder Flughäfen usw. verwendet wird, kann die Anzahl der Datenfahrten enorm sein. Jede Anforderung an eine Datenbank verbraucht Bandbreite und erfordert Zeit für die Ausführung. Ohne die Tabellenwertparameter muss eine Frontanwendung mehrere Datenfahrten durchführen, um mehrere Datenzeilen zu bearbeiten. Mit Tabellenwertparametern können jedoch mehrere Zeilen eingefügt, aktualisiert und aus einer Datenbank gelöscht werden, indem ein einziger parametrisierter Befehl verwendet wird, der einen Tabellenwertparameter annimmt.

Ein Tabellenwertparameter ist ein Parameter mit einem Tabellentyp. Mit diesem Parameter können Sie mehrere Datenzeilen in Form einer Tabelle an eine gespeicherte Prozedur oder einen parametrisierten SQL-Befehl senden. Transact-SQL kann verwendet werden, um auf die Spaltenwerte der Tabellenwertparameter zuzugreifen.

In diesem Artikel werden wir untersuchen, wie wir eine Datentabelle an eine gespeicherte Prozedur übergeben können. Sehen wir uns jedoch vorher an, wie Tabellendaten früher vor Tabellenwertparametern übergeben wurden.

Daten in tabellarischer Form vor tabellenwertigen Parametern übergeben

Tabellenwertparameter wurden in SQL Server 2008 eingeführt. Davor gab es eingeschränkte Möglichkeiten, Tabellendaten an gespeicherte Prozeduren zu übergeben. Die meisten Entwickler haben eine der folgenden Methoden verwendet:

  1. Daten in mehreren Spalten und Zeilen wurden in Form einer Reihe von Parametern dargestellt. Die maximale Anzahl von Parametern, die an eine gespeicherte SQL Server-Prozedur übergeben werden können, beträgt jedoch 2.100. Daher konnte diese Methode im Fall einer großen Tabelle nicht verwendet werden. Des Weiteren ist eine serverseitige Vorverarbeitung erforderlich, um die einzelnen Parameter tabellarisch aufzubereiten.
  2. Erstellen Sie mehrere SQL-Anweisungen, die sich auf mehrere Zeilen auswirken können, z. B. UPDATE. Die Kontoauszüge können einzeln oder in Stapelform an den Server gesendet werden. Auch wenn sie gestapelt gesendet werden, werden die Anweisungen einzeln auf dem Server ausgeführt.
  3. Eine andere Möglichkeit besteht darin, getrennte Zeichenfolgen oder XML-Dokumente zu verwenden, um Daten aus mehreren Zeilen und Spalten zu bündeln und diese Textwerte dann an parametrisierte SQL-Anweisungen oder gespeicherte Prozeduren zu übergeben. Der Nachteil dieses Ansatzes war, dass Sie die Datenstruktur validieren mussten, um die Werte zu entbündeln.

Datentabelle als Parameter an gespeicherte Prozeduren übergeben

Sehen wir uns nun an, wie Tabellenwertparameter verwendet werden können, um Daten an eine gespeicherte Prozedur zu senden, ohne dass die im vorherigen Abschnitt beschriebenen Probleme auftreten. Tabellenwertparameter ermöglichen die Übergabe mehrerer Datenzeilen an eine gespeicherte Prozedur durch Transact-SQL-Code oder eine Front-End-Anwendung. Die maximale Größe, die ein Tabellenwertparameter haben kann, entspricht der maximalen Speichergröße des Datenbankservers.

In diesem Abschnitt verwenden wir Tabellenwertparameter zusammen mit einer gespeicherten Prozedur, um mehrere Zeilen in eine Datentabelle einzufügen.

Das Übergeben von Tabellenwertparametern an eine gespeicherte Prozedur ist ein dreistufiger Prozess:

  1. Erstellen Sie einen benutzerdefinierten Tabellentyp, der der Tabelle entspricht, die Sie füllen möchten.
  2. Übergeben Sie die benutzerdefinierte Tabelle als Parameter an die gespeicherte Prozedur
  3. Wählen Sie innerhalb der gespeicherten Prozedur die Daten aus dem übergebenen Parameter aus und fügen Sie sie in die Tabelle ein, die Sie füllen möchten.

Sehen wir uns ein Beispiel an, wie wir eine Datentabelle mithilfe einer Tabellenwertfunktion an eine gespeicherte Prozedur übergeben können.

Erstellen Sie zunächst eine Tabelle, die wir füllen möchten. Führen Sie das folgende Skript aus:

CREATE DATABASE ShowRoom


USE ShowRoom
Create Table Cars
(
    Id int primary key,
    Name nvarchar(50),
    company nvarchar(50)
)
Go

Im obigen Skript erstellen wir eine Datenbank namens ShowRoom mit einer Tabelle, z. B. Cars. Die Cars-Tabelle hat drei Spalten:ID, Name und Firma. Wir verwenden eine gespeicherte Prozedur, um die Cars-Tabelle zu füllen.

Wie bereits beschrieben, besteht der erste Schritt darin, einen benutzerdefinierten Tabellentyp zu erstellen, der der Tabelle entspricht, die Sie füllen möchten. Führen Sie dazu das folgende Skript aus:

CREATE TYPE CarTableType AS TABLE
(
     Id int primary key,
    Name nvarchar(50),
    company nvarchar(50)
)
Go

Im obigen Skript erstellen wir die benutzerdefinierte Variable CarTableType vom Typ Tabelle. Dies ist die Variable, die wir an die gespeicherte Prozedur übergeben. Es ist ersichtlich, dass die Spalten der CarTableType-Variablen denen in der Cars-Tabelle ähneln.

Lassen Sie uns nun eine gespeicherte Prozedur erstellen, die die CarTableType-Variable als Parameter akzeptiert. Innerhalb der gespeicherten Prozedur wählen wir alle Datensätze aus dieser Variablen aus und fügen sie in die Cars-Tabelle ein. Führen Sie das folgende Skript aus, um eine solche gespeicherte Prozedur zu erstellen:

CREATE PROCEDURE spInsertCars
@CarType CarTableType READONLY
AS
BEGIN
    INSERT INTO Cars
    SELECT * FROM @CarType
END

Im obigen Skript erstellen wir die gespeicherte Prozedur spInsertCars. Es ist wichtig zu erwähnen, dass Sie den benutzerdefinierten Parameter innerhalb der gespeicherten Prozedur als READONLY angeben müssen, andernfalls führt dies zu einem Laufzeitfehler.

Sie können sehen, dass die gespeicherte Prozedur spInsertCars den CarTableType-Parameter akzeptiert und ihn der @CarType-Variable des CarTableType-Typs zuweist.

Der letzte Schritt besteht darin, eine Variable der CarTableType-Variablen zu erstellen, sie mit Dummy-Daten zu füllen und sie an die gespeicherte Prozedur spInsertCars zu übergeben. Sehen Sie sich das folgende Skript an:

DECLARE @CarTableType CarTableType

INSERT INTO @CarTableType VALUES (1, 'Corrolla', 'Toyota')
INSERT INTO @CarTableType VALUES (2, 'Civic', 'Honda')
INSERT INTO @CarTableType VALUES (3, '6', 'Audi')
INSERT INTO @CarTableType VALUES (4, 'c100', 'Mercedez')
INSERT INTO @CarTableType VALUES (5, 'Mustang', 'Ford')

EXECUTE spInsertCars @CarTableType

Im obigen Skript deklarieren wir zuerst die Variable @CarTableType vom Typ CarTableType. Wir fügen dann 5 Dummy-Datensätze in diese Variable ein. Schließlich führen wir die gespeicherte Prozedur spInsertCars aus und übergeben ihr die Variable @CarTableType als Parameter.

Innerhalb der gespeicherten Prozedur werden fünf Datensätze aus der Variablen @CarTableType ausgewählt und in die Cars-Tabelle eingefügt. Wenn Sie nun alle Datensätze aus der Cars-Tabelle auswählen, sollten Sie die neu eingefügten Datensätze sehen. Führen Sie dazu das folgende Skript aus:

SELECT * FROM Cars

Die Ausgabe des obigen Skripts sieht so aus:

Aus der Ausgabe ist ersichtlich, dass alle Datensätze aus der Variablen @CarTableType in die Cars-Tabelle eingefügt wurden.