Tugce for beginners – INSERT

INSERT-Befehl wird verwendet, um einer Tabelle Datensätze hinzuzufügen.

IMG_6164

 

In SQL gibt es im Wesentlichen mehrere Methoden zum Einfügen von Daten in eine Tabelle. Zum einen wird jeweils eine Zeile eingefügt und zum anderen mehrere Zeilen gleichzeitig.

Das Einfügen vieler Datensätze am Stück ist grundsätzlich wesentlich performanter als Zeile-für-Zeile einzufügen. Dies wird auch in der Fachsprache unterschieden. Masseneinfügeoperationen, welch schönes deutsches Wort, nennt man beispielsweise Bulk Inserts. Doch fangen wir mal von vorne an.

Um beispielsweise einen Datensatz mit 2 Werten in deine Datenbank zu speichern, benutzt man ein INSERT Statement mit der folgenden Syntax:

INSERT INTO Tabelle/Sicht (Spalte1, Spalte2)
VALUES (Wert1, Wert2)

Mit dem zweiten Typ von INSERT INTO können wir mehrere Zeilen (ah, der Bulk Insert!) in eine Tabelle einfügen. In der oberen Syntax haben wir eine einzelne Zeile durch Angabe der Werte (VALUES) für alle Spalten eingefügt. Für die zweite Methode verwenden wir eine SELECT-Anweisung, um die einzufügenden Daten festzuhalten. Die Syntax sieht folgendermaßen aus:

INSERT INTO Tabellen/Sicht (Spalte1, Spalte2)
SELECT Spalte3, Spalte4
From andererTabelle/Sicht
WHERE Spalte5 = ‘ab‘
go

Kann man neue Werte einfügen und zugleich bestehende Werte aus anderen Tabellen einfügen? So funktioniert’s:

Idee:

INSERT INTO Tabelle
SELECT ‚A‘, ‚B‘ , Spalte1, Spalte2
From Tabelle

Soweit so gut.
Was ist aber mit den Ergebnissen aus Stored Procedures oder aus DBCC (Database Console Commands)-Befehlen? Prozeduren und DBCC-Anweisungen werden eben nicht per Select ausgegeben.

Wie lassen sich aber Stored Procedures und DBCC in „normalen“ Insert-Anweisungen integrieren?

Beispiel:

//hier erst Tabelle erstellen
create table #test1
(ObjectName varchar(100),
ObjectId int,
IndexName varchar(100),
IndexId int,
[Level] int,
Pages int,
[Rows] int,
MinimumRecordSize int,
MaximumRecordSize int,
AverageRecordSize int,
ForwardedRecords int,
Extents int,
ExtentSwitches int,
AverageFreeBytes float,
AveragePageDensity float,
ScanDensity float,
BestCount int,
ActualCount int,
LogicalFragmentation int,
ExtentFragmentation float
)

insert into #test1                                                              //hier dann insert Befehl
exec('dbcc showcontig (b2) with tableresults') //dbcc muss mit “with Tableresults” ausgeführt werden

          //dann mit exec das statement ausführen, ohne gehts nicht,   weil dbcc nicht nach insert kommen darf!
select * from #test1                                                       //temp Tabelle aufrufen, fertig

Kommentare sind geschlossen