Transact-SQL (Microsoft SQL Server), Frage zu Stored Procedure

Gast #2785511
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
Persönliche Seite #2785517
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
Gast #2785522
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
Gast #2785650
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren