Установите переменную в SCOPE_IDENTITY внутри оператора IF - PullRequest
12 голосов
/ 08 сентября 2011

Я пытаюсь написать хранимую процедуру, которая проверит наличие записи и, если она не существует, вставит сообщение, возвращающее SCOPE_IDENTITY, и, если оно существует, просто вернет идентификатор объекта.После того как я получу эту информацию в процедуре, мне нужно будет выполнить дальнейшую обработку с ней, и я не уверен, как выполнить получение SCOPE_IDENTITY из оператора IF...ELSE.

Мои две таблицы:

CREATE TABLE [dbo].[ActionTable] (
    [ActionID] [int] IDENTITY(1, 1) NOT NULL,
    [ObjectID] [int] NOT NULL,
    [ActionName] [nvarchar](255) NOT NULL
)

CREATE TABLE [dbo].[ObjectTable] (
    [ObjectID] [int] IDENTITY(1, 1) NOT NULL,
    [ObjectName] [nvarchar](255) NOT NULL
)

Хранимая процедура:

CREATE PROCEDURE [dbo].[SetAction]
    @ActionName [nvarchar](255),
    @ObjectName [nvarchar](255)
AS
    DECLARE @ObjectID [int]

    --I have tried the following

    IF NOT EXISTS(SELECT ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName)
        INSERT INTO ObjectTable(ObjectName)VALUES(@ObjectName)
        --Here I need to set @ObjectID = SELECT SCOPE_IDENTITY()
    ELSE
        SELECT @ObjectID = ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName

Возвращает Incorrect syntax near the keyword 'ELSE'

Какой будет наилучший метод для выполнения этого поиска / вставки?После того, как я получу удостоверение личности, я сделаю следующее

INSERT INTO ActionTable(ObjectID, ActionName) VALUES(@ObjectID, @ActionName)

SELECT SCOPE_IDENTITY()

Ответы [ 2 ]

26 голосов
/ 08 сентября 2011

Если вам нужно сделать несколько вещей, вам нужно НАЧАТЬ КОНЕЦ

IF NOT EXISTS(SELECT ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName)
BEGIN
    INSERT INTO ObjectTable(ObjectName)VALUES(@ObjectName)
    SET @ObjectID = SCOPE_IDENTITY()
END
ELSE
BEGIN
    SELECT @ObjectID = ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName
END
4 голосов
/ 08 сентября 2011

Вы всегда должны использовать BEGIN / END даже для только одного оператора, чтобы при последующем добавлении операторов ваш код не нарушался.

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