Forum: PC Hard- und Software Transact-SQL (Microsoft SQL Server), Frage zu Stored Procedure


von Klaus Trophob (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

@ Rufus Τ. Firefly

du hast mit dem Tsql das gleiche Problem wie  Klaus. Es liefert 2 
Resultsets zurück, nur das das erste leer ist.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Klaus Trophob (Gast)


Lesenswert?

Die FarbID wird der Prozedur beim Aufruf uebergeben.

von Peter II (Gast)


Lesenswert?

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

von Klaus Trophob (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.