In einer Anwendung schiebe ich Daten in eine Datenbank auf einem Microsoft SQL Server 2008 (aktuell Express). Sagen wir beispielsweise, ich wollte Farben von Autos speichern. Ich habe also eine Tabelle Autofarben (Spalten AutoID und FarbID) und eine Tabelle AutofarbenID (FarbID und Farbe). Meine gespeicherte Prozedur soll eine Farbe entgegennehmen und ihre FarbID zurueckliefern, wenn sie existiert, oder sie anlegen und zurueckliefern. Meine Prozedur saehe also in etwa so aus: ALTER Procedure sp_farbid ( @farbe NCHAR(100) ) BEGIN SET NOCOUNT ON SELECT farbid.farbid FROM farbid WHERE farbid.farbe = @farbe IF @@ROWCOUNT = 0 BEGIN INSERT INTO farbid VALUES (@farbid) SELECT scope_identity() END END Leider liefert die Prozedur, wenn sie einen Eintrag anlegt, nichts zurueck und muesste dann ein zweites Mal aufgerufen werden, was sie ueberfluessig macht. a) Gibt es eine Moeglichkeit, die Prozedur zu reparieren, was sollte ich verbessern? b) Ist mein Ansatz so richtig oder loest 'man' das anders? Vielen Dank
Klaus Trophob schrieb: > INSERT INTO farbid VALUES (@farbid) Wo kommt @farbid her? Übrigens wird so etwas lesbarer, wenn man es formatiert.
1 | ALTER Procedure sp_farbid(@farbe NCHAR(100)) AS |
2 | BEGIN |
3 | SET NOCOUNT ON |
4 | SELECT farbid.farbid FROM farbid |
5 | WHERE farbid.farbe = @farbe |
6 | |
7 | IF @@ROWCOUNT = 0 |
8 | BEGIN |
9 | INSERT INTO farbid VALUES (@farbid) |
10 | SELECT scope_identity() |
11 | END |
12 | END |
ALTER Procedure sp_farbid @farbe NCHAR(100) as SET NOCOUNT ON declare @farbid int; SELECT @farbid = farbid.farbid FROM farbid WHERE farbid.farbe = @farbe IF @farbid is null BEGIN INSERT INTO farbid VALUES (@farbid) set @farbid = @@identiy END select @farbid as FarbId; END
@ Rufus Τ. Firefly du hast mit dem Tsql das gleiche Problem wie Klaus. Es liefert 2 Resultsets zurück, nur das das erste leer ist.
Peter II schrieb: > du hast mit dem Tsql das gleiche Problem wie Klaus Ich habe damit gar kein Problem, denn ich habe nur Klaus' Beispiel lesbarer formatiert (und "AS" hinzugefügt). Daß seine stored procedure nicht funktioniert, ist mir klar, aber ich hatte mit einer Antwort auf meine Frage gerechnet.
Die FarbID wird der Prozedur beim Aufruf uebergeben.
Klaus Trophob schrieb: > Die FarbID wird der Prozedur beim Aufruf uebergeben. nein wird gemacht, du übergibst die Farbe so sollte es passen ALTER Procedure sp_farbid @farbe NCHAR(100) as SET NOCOUNT ON declare @farbid int; SELECT @farbid = farbid.farbid FROM farbid WHERE farbid.farbe = @farbe IF @farbid is null BEGIN INSERT INTO farbid VALUES (@farbe) set @farbid = @@identiy END select @farbid as FarbId; END
In der Form funktioniert es, danke!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.