Хранимая процедура SQL 2005 для возврата значения или его создания, если оно не существует - PullRequest
1 голос
/ 22 февраля 2009

У меня проблемы с хранимой процедурой (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

Я не могу заставить оператор select возвращать TagID, когда существует Tagname.

Ответы [ 3 ]

9 голосов
/ 22 февраля 2009

Примечание: не используйте @@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 голосов
/ 22 февраля 2009
SELECT

@returnValue = TagID

FROM tbrm_Tags

WHERE TagName = @TagName
0 голосов
/ 22 февраля 2009

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

SELECT @returnValue AS RETURNVALUE

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...