SQL: mit Query-Resultaten gleich weiterarbeiten
2 Kommentare
Bei einer Datenbankstruktur mit vielen Join-Tabellen gibt es ein recht einfaches Schema, wie man neue Einträge schreibt:
- Eintrag in Haupttabelle
- Auslesen der neusten ID
- 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: 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>
1DECLARE @newID int
Und als Beispiel eine ganze Prozedur:
1DECLARE @newID int SET NOCOUNT ON INSERT INTO Newsletterstatistik (JobID,Recipients,SendDateTime) VALUES( '1155', 'info@backslash.ch', 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.