Einfügen von Daten

Abgeschlossen

Transact-SQL bietet mehrere Möglichkeiten zum Einfügen von Zeilen in eine Tabelle.

INSERT-Anweisung

Die INSERT-Anweisung wird verwendet, um einer Tabelle eine oder mehrere Zeilen hinzuzufügen. Es gibt verschiedene Formen dieser Anweisung.

Die grundlegende Syntax einer einfachen INSERT-Anweisung ist nachfolgend dargestellt:

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

Bei dieser Form der INSERT-Anweisung, die INSERT VALUES genannt wird, können Sie die Spalten angeben, in denen Werte platziert werden, und die Reihenfolge festlegen, in der die Daten für jede in die Tabelle eingefügte Zeile angezeigt werden. Die Verwendung von „column_list“ ist optional, wird aber empfohlen. Ohne „column_list“ erwartet die INSERT-Anweisung einen Wert für jede Spalte in der Tabelle in der Reihenfolge, in der die Spalten definiert wurden. Sie können die Werte für diese Spalten auch als eine durch Kommas getrennte Liste angeben.

Beim Auflisten von Werten bedeutet das Schlüsselwort DEFAULT, dass ein vordefinierter Wert verwendet wird, der beim Erstellen der Tabelle angegeben wurde. Es gibt drei Möglichkeiten, einen Standardwert zu bestimmen:

  • Wenn für eine Spalte ein automatisch generierter Wert definiert wurde, wird dieser Wert verwendet. Automatisch generierte Werte werden später in diesem Modul erläutert.
  • Beim Erstellen einer Tabelle kann ein Standardwert für eine Spalte angegeben werden, und dieser Wert wird dann bei Festlegung von DEFAULT verwendet.
  • Wenn eine Spalte so definiert wurde, dass NULL-Werte zulässig sind, und die Spalte keine automatisch generierte Spalte ist und kein Standardwert definiert ist, wird NULL als DEFAULT eingefügt.

Die Details der Tabellenerstellung gehen über den Rahmen dieses Moduls hinaus. Es ist aber oft hilfreich zu sehen, welche Spalten in einer Tabelle enthalten sind. Die einfachste Möglichkeit ist das Ausführen einer SELECT-Anweisung für die Tabelle, ohne Zeilen zurückzugeben. Durch Verwendung einer WHERE-Bedingung, die niemals TRUE sein kann, werden keine Zeilen zurückgegeben.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

Mit dieser Anweisung werden alle Spalten und deren Namen angezeigt, jedoch keine Datentypen oder Eigenschaften, wie z. B. ob NULL-Werte zulässig oder Standardwerte angegeben sind. Ein Beispiel für die Ausgabe dieser Abfrage kann wie folgt aussehen:

PromotionName

StartDate

ProductModelID

Discount

Notizen

Zum Einfügen von Daten in diese Tabelle können Sie die INSERT-Anweisung wie nachfolgend gezeigt verwenden.

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

In dem Beispiel oben kann die Spaltenliste ausgelassen werden, da ein Wert für jede Spalte in der richtigen Reihenfolge angegeben wird:

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

Angenommen, die Tabelle ist so definiert, dass das heutige Datum als Standardwert für die Spalte StartDate verwendet wird und die Spalte Notes NULL-Werte zulässt. Sie können auf folgende Weise angeben, dass diese Werte explizit verwendet werden sollen:

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

Alternativ können Sie Werte in der INSERT-Anweisung auslassen. In diesem Fall wird der Standardwert verwendet, sofern er definiert ist. Ist kein Standardwert vorhanden und sind NULL-Werte in der Spalte zulässig, wird ein NULL-Wert eingefügt. Wenn Sie nicht für alle Spalten Werte angeben, muss eine Spaltenliste vorhanden sein, in der die bereitgestellten Spaltenwerte angegeben sind.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

Zusätzlich zum Einfügen einer einzelnen Zeile kann die INSERT VALUES-Anweisung auch zum Einfügen mehrerer Zeilen verwendet werden. Dazu werden mehrere durch Kommas getrennte Wertesätze bereitgestellt. Die Wertesätze sind wie nachfolgend gezeigt ebenfalls durch Kommas getrennt:

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

Diese Liste von Werten wird als Tabellenwertkonstruktor bezeichnet. Hier sehen Sie ein Beispiel für das Einfügen zwei weiterer Zeilen in die Tabelle mit einem Tabellenwertkonstruktor:

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

INSERT ... SELECT

Zusätzlich zum Angeben eines Literalwertesatzes in einer INSERT-Anweisung unterstützt T-SQL auch die Verwendung von Ergebnissen anderer Vorgänge, um Werte für INSERT anzugeben. Sie können die Ergebnisse einer SELECT-Anweisung oder die Ausgabe einer gespeicherten Prozedur verwenden, um die Werte für die INSERT-Anweisung bereitzustellen.

Wenn Sie INSERT mit einer geschachtelten SELECT-Anweisung verwenden möchten, erstellen Sie eine SELECT-Anweisung, um die VALUES-Klausel zu ersetzen. Mit dieser Form, die als INSERT SELECT bezeichnet wird, können Sie die von einer SELECT-Abfrage in eine Zieltabelle zurückgegebene Gruppe von Zeilen einfügen. Für die Verwendung von INSERT SELECT gelten die gleichen Bedingungen wie für INSERT VALUES:

  • Sie können optional eine Spaltenliste nach dem Tabellennamen angeben.
  • Sie müssen Spaltenwerte, DEFAULT oder NULL für jede Spalte angeben.

Die folgende Syntax veranschaulicht die Verwendung von INSERT SELECT:

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

Hinweis

Resultsets aus gespeicherten Prozeduren (oder sogar dynamischen Batches) können ebenfalls als Eingabe für eine INSERT-Anweisung verwendet werden. Diese Form von INSERT, die INSERT EXEC genannt wird, ähnelt vom Prinzip her der INSERT SELECT-Anweisung, und es gelten hierfür die gleichen Bedingungen. Gespeicherte Prozeduren können jedoch mehrere Resultsets zurückgeben, sodass besondere Vorsicht geboten ist.

Im folgenden Beispiel werden mehrere Zeilen für eine neue Werbeaktion mit dem Namen Get Framed eingefügt. Dazu werden die Modell-ID und der Modellname aus der Tabelle Production.ProductModel für jedes Modell abgerufen, das „frame“ im Namen enthält.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';

Im Gegensatz zu einer Unterabfrage wird die geschachtelte SELECT-Anweisung, die mit INSERT verwendet wird, nicht in Klammern eingeschlossen.

SELECT ... INTO

Eine weitere Möglichkeit zum Einfügen von Zeilen, die INSERT SELECT ähnelt, ist die SELECT INTO-Anweisung. Der größte Unterschied zwischen INSERT SELECT und SELECT INTO besteht darin, dass SELECT INTO nicht zum Einfügen von Zeilen in eine vorhandene Tabelle verwendet werden kann, da hiermit immer eine neue Tabelle erstellt wird, die auf dem Ergebnis der SELECT-Anweisung basiert. Jede Spalte in der neuen Tabelle weist denselben Namen, denselben Datentyp und dieselbe NULL-Zulässigkeit wie die entsprechende Spalte (oder der entsprechenden Ausdruck) in der SELECT-Liste auf.

Um SELECT INTO zu verwenden, fügen Sie „INTO <new_table_name>“ in der SELECT-Klausel der Abfrage unmittelbar vor der FROM-Klausel hinzu. Im folgenden Beispiel werden Daten aus der Tabelle Sales.SalesOrderHeader in eine neue Tabelle mit dem Namen Sales.Invoice extrahiert.

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

Bei SELECT INTO tritt ein Fehler auf, wenn bereits eine Tabelle mit dem nach INTO angegebenen Namen vorhanden ist. Nachdem die Tabelle erstellt wurde, kann sie wie jede andere Tabelle behandelt werden. Sie können Einträge daraus auswählen, sie mit anderen Tabellen verbinden oder weitere Zeilen einfügen.