Хранимая процедура SQL 2005 для возврата значения или создания его, если он не существует


1

У меня возникли проблемы с хранимой процедурой (SQL 2005).

У меня есть стол под названием tbrm_Tags с двумя колонками, TagID и TagName. Я хочу, чтобы передать значение TagName хранимой процедуры, а затем я хочу:

  1. Проверить, если Tagname существует, и если это действительно возвращают TagID
  2. Если Tagname не существует, я хочу, чтобы вставить таблицу и вернуть TagID.

Вот хранимая процедура я использую:

@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 

Я не могу получить отборное заявление о возвращении TagID когда Tagname существует.

9

Примечание: не используйте @@IDENTITY - она ​​подлежит триггера; всегда используйте SCOPE_IDENTITY()

Я мог бы просто сделать:

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

Я подозреваю код Марк Гурджиева будет работать нормально, но я бы сделал последнюю строку:

SELECT @returnValue AS RETURNVALUE 

Я всегда делал это так, но я не уверен, что существует какая-либо функциональная разница между этими двумя методами ... кто-нибудь знает?

  0

Существует огромная разница. Один использует возвращаемое значение proc; другой возвращает сетку с одной ячейкой. Эти два несовместимы. Возвращаемое значение немного (не массово) более эффективно и намного более чистое, если вы вызываете непосредственно из TSQL (INSERT/EXEC - беспорядок). 22 фев. 092009-02-22 20:12:27