SQL Server: Drei verschiedene Arten von INSERT

Beim rumspielen mit einer Datenbank von mir ist mir aufgefallen, das man drei verschiedene Varianten hat Daten in die Datenbank einzutragen.

INSERT / VALUES
Alle Werte werden der Tabelle übergeben.

  1. INSERT MeineTabelle
  2. VALUES (1, 2, 3)

Das INTO ist optional in der Syntax, sowie die Liste der Felder der Namen der Tabelle, wenn die Anzahl der übergebenen Werte in VALUES entsprechend der Anzahl der Felder in der Tabelle ist. In diesem Falle ist die Angabe obligatorisch.

  1. INSERT MeineTabelle (FeldA, FeldB)
  2. VALUES (1, 2)

Es ist möglich die Keywords DEFAULT und DEFAULT VALUES zu benutzen, sie erlauben die Übergabe der Standardwerte des Feldes, wo man DEFAULT vorgibt oder es NULL sein darf. Die zweite Methode übergibt für alle Felder die Standardwerte in der Tabelle.

  1. -- Eintrag des Vorgabewertes von FeldB
  2. INSERT MeineTabelle (FeldA, FeldB)
  3. VALUES (1, DEFAULT)
  4.  
  5. -- Eintrag der Vorgabewerte für alle Felder von der Tabelle
  6. INSERT MeineTabelle (FeldA, FeldB)
  7. DEFAULT VALUES

Unter SQL Server 2008 wird es möglich sein, mehrere Datensätze aufeinmal mit folgender Syntax einzutragen.

  1. INSERT MeineTabelle (FeldA, FeldB)
  2. VALUES (1, 2), (3, 4), (5, 6)

Das fügt drei Datensätze in MeineTabelle hinzu.

INSERT / SELECT
Die zweite Variante ermöglicht die Eintragung mehrfacher Datensätze aus einer anderen Quelle der Datenbank (oder der gleichen).

  1. INSERT MeineTabelle
  2. SELECT *
  3. FROM MeineTabelle2

Im nächsten Beispiel, muss die Anzahl der Felder die VALUES übergibt, exakt die selbe Anzahl der Felder in der Tabelle haben.

  1. INSERT MeineTabelle (FeldA, FeldB)
  2. SELECT FeldX, FeldY
  3. FROM MeineTabelle2

Auch folgende Methode erfüllt ihren Einsatzweck:

  1. INSERT MeineTabelle (FeldA, FeldB)
  2. SELECT FeldX, 7
  3. FROM MeineTabelle2

INSERT / EXEC
Die letzte Variante ist ohne Zweifel die am wenig bekannteste. Mit dieser Variante erhält man das Ergebnis einer Prozedur oder eine Ausführung dynamisch zurück. Die Schwierigkeit dieser Syntax beruht auf der Tatsache, das die Tabelle beim INSERT nicht weiß, wie die vorgegebene Struktur aussieht.

  1. INSERT MeineTabelle
  2. EXEC MeineProz 1, 2
  3.  
  4. INSERT MeineTabelle2
  5. EXEC('DBCC SHOWCONTIG WITH TABLERESULTS')

Hier ist es auch möglich, die Liste der Felder der Bestimmungstabelle hinter ihrem Namen zu spezifieren. Hingegen auf der Ebene von EXEC ist dies nicht möglich dies zu ändern. Auf diese Art und Weise erhält man nur den ersten Stapel von Daten in dem Fall, falls die Prozedur auf mehrere andere Daten verweist.

Mit dieser Methode kann man in der Tat alles abrufen, da das SQL alles dynamisch verarbeitet. Im zweiten Beispiel kann man sogar dem DBCC Befehle erteilen und damit die Tabelle füllen. Besonders bei der letzten Variante empfehle ich die MSDN zu durchstöbern, da das sehr komplex ist.

Und nun viel Spass mit dieser neuen Erkenntnis 😉

Einen Kommentar schreiben