SQL: mit Query-Resultaten gleich weiterarbeiten

2 Kommentare
Mischa Sameli, Geschäftsführer & Leiter Entwicklung

Bei einer Datenbankstruktur mit vielen Join-Tabellen gibt es ein recht einfaches Schema, wie man neue Einträge schreibt:

  1. Eintrag in Haupttabelle
  2. Auslesen der neusten ID
  3. Eintrag in Join-Tabellen mit der neusten ID

Das funktioniert ja ganz gut, hat aber den Nachteil, dass 3 Abfragen abgesetzt werden müssen. Nun kann man aber den 2. Punkt auslassen, wenn man die neue ID bereits als Rückgabewert des Eintrag-Querys liefert:

1<cfquery name="qryEintrag" datasource="dsn">
2SET NOCOUNT ON
3INSERT INTO Benutzer
4(email, name, vorname, ...)
5VALUES
6('#form.email#',
7'#form.name#',
8'#form.vorname#',
9...)
10SELECT SCOPE_IDENTITY() AS newId
11SET NOCOUNT OFF
12</cfquery>
CF-seitig hat man nun in der Variable qryEintrag.newID die neue ID im Zugriff und kann damit ein zweites Query absetzen. Wie lässt sich das nun nochmals verpacken? Lokale SQL-Variablen helfen uns dabei:
1DECLARE @newID int
Und als Beispiel eine ganze Prozedur:
1DECLARE @newID int SET NOCOUNT ON INSERT INTO Newsletterstatistik (JobID,Recipients,SendDateTime) VALUES( &#39;1155&#39;, &#39;info@backslash.ch&#39;, getDate() ) set @newID = SELECTT SCOPE_IDENTITY()) INSERT INTO Newsletter_Newsletterstatistik_Join (Newsletter_ID,Newsletterstatistik_ID) VALUES( 1, @newID ) SET NOCOUNT OFF
Zuerst wird also eine Lokale Variable definiert, dann das Query ausgeführt, der lokalen Variable wird die neuste ID zugewiesen und mit dieser Variable kann dann weiter gearbeitet werden.

neuen Kommentar erstellen

Marco's Gravatar
Bei fällen, bei welchen nicht die neue ID weiterverwendet werden muss sicher sinnvoll, allerdings sollte man wirklich die ID benötigen kann man das ganze noch ein wenig einfacher lösen:
DECLARE @newId int
SET IDENTITY_INSERT tblTest OFF
INSERT INTO tblTest (strName) VALUES ('meinName')

SET @newId = @@identity

INSERT INTO tblTest_Join (Join_ID) VALUES (@newId)
INSERT INTO tblTest_Join_Join (Join_Join_ID) VALUES (@newId)

Und sollte man nur eine Join Tablle gefüttert werden müssen, kann man sich den Umweg über die lokale Variable sparen:
SET IDENTITY_INSERT tblTest OFF
INSERT INTO tblTest (strName) VALUES ('meinName')

INSERT INTO tblTest_Join (Join_ID) VALUES (@@identity)
Marco, am 25. Juni 2007 um 11:52 Uhr
Mischa Sameli's Gravatar
In der Tat, einfacher und mit demselben Ergebnis. Danke für den Hinweis!
Mischa Sameli, am 25. Juni 2007 um 12:54 Uhr
Bitte lassen Sie dieses Feld leer
Kommentar hinzufügen


Bitte lassen Sie dieses Feld leer
Beitrag als E-Mail verschicken
E-Mail via Webmail versenden

Schön, dass Ihnen unser Beitrag gefallen hat. Benutzen Sie folgende Social Networking Dienste, um den Beitrag abzulegen und zu verteilen. Selbstverstädlich können Sie ein direktes Lesezeichen auf diesen Artikel setzen.