Procédure stockée SQL 2005 pour renvoyer une valeur ou la créer si elle n'existe pas


1

J'ai des problèmes avec une procédure stockée (SQL 2005). J'ai une table appelée tbrm_Tags avec deux colonnes, TagID et TagName. Je veux passer une valeur TagName à la procédure stockée et puis je veux:

  1. Vérifiez si le Tagname existe et si elle ne retourne la TagID
  2. Si le Tagname n'existe pas que je veux insérer dans la table et renvoyez le TagID.

Voici la procédure stockée J'utilise:

@TagID int = null, 
    @TagName varchar(50) 

AS 

DECLARE @returnValue int 

    BEGIN 
    IF EXISTS (SELECT * FROM tbrm_Tags WHERE TagName = @TagName) 
    BEGIN 

    SELECT 

    TagID 

    FROM tbrm_Tags 

    WHERE TagName = @TagName 

END 
ELSE 
BEGIN 
IF NOT EXISTS (SELECT * FROM tbrm_Tags WHERE TagName = @TagName) 

    INSERT INTO tbrm_Tags 

    (
    TagName 

) 
    VALUES 
    (
    @TagName 

    ) 

    SELECT @returnValue = @@IDENTITY 

    END 
    END 

    RETURN @returnValue 

Je ne peux pas obtenir l'instruction select pour retourner le TagID lorsque le Tagname existe.

9

Remarque: ne pas utiliser @@IDENTITY - il est soumis à des déclenchements; toujours utiliser SCOPE_IDENTITY()

Je pourrais simplement faire:

DECLARE @returnValue int 

SELECT @returnValue = TagID 
FROM tbrm_Tags 
WHERE TagName = @TagName 

IF @returnValue IS NULL 
BEGIN 
    INSERT tbrm_Tags(TagName) 
    VALUES (@TagName) 

    SET @returnValue = SCOPE_IDENTITY() 
END 

RETURN @returnValue 

3
SELECT 

@returnValue = TagID 

FROM tbrm_Tags 

WHERE TagName = @TagName 

0

Je soupçonne le code de Marc G. fonctionnerait très bien, mais je l'aurais fait la dernière ligne comme celui-ci:

SELECT @returnValue AS RETURNVALUE 

Je l'ai toujours fait de cette façon, mais je ne suis pas sûr qu'il y ait une différence fonctionnelle entre les deux méthodes ... quelqu'un le sait?

  0

Il y a une énorme différence. On utilise la valeur de retour du proc; l'autre renvoie une grille avec une cellule. Les deux sont incompatibles. La valeur de retour est un peu (pas massivement) plus efficace, et beaucoup plus propre si vous appelez de TSQL directement (INSERT/EXEC est un gâchis). 22 févr.. 092009-02-22 20:12:27