SQL Server понимает SCOPE_IDENTITY () - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть этот кусок кода в хранимой процедуре:

BEGIN
    SET @UserId = NULL;
    IF (@Username IS NOT NULL)
    BEGIN
        EXECUTE SP_ADD_USER @Username, @UserId OUTPUT;
    END
    EXECUTE SP_ADD_ALERT @Name, @AlertType, @AlertId OUTPUT;
    INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage) 
        VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage);
    SET @AlertLogId = SCOPE_IDENTITY();
END

@AlertLogId - выходной параметр, который я хочу присвоить результату последней вставки в таблицу AlertLogs. Нужно ли включать

INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage) 
        VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage);

в новом блоке (новая область начала / конца), чтобы SCOPE_IDENTITY() работал правильно? (а не сообщать, например, последний идентификатор вставленной записи, сделанный в SP_ADD_ALERT, например?)

Ответы [ 2 ]

6 голосов
/ 22 ноября 2011

В вашем запросе SCOPE_IDENTITY() собирается вернуть последнее введенное значение идентификатора в базу данных для этой области.

В этом случае это будет идентификатор для таблицы AlertLogs, еслион имеет идентификатор.

Область действия - это модуль: хранимая процедура, триггер, функция или пакет.Поэтому два оператора находятся в одной и той же области, если они находятся в одной и той же хранимой процедуре, функции или пакете.

http://msdn.microsoft.com/en-us/library/ms190315.aspx

1 голос
/ 22 ноября 2011

Вы также можете использовать предложение OUTPUT в своем операторе вставки.Это означает, что вам не нужно беспокоиться о области действия, и вы делаете другую (не идентифицирующую) информацию доступной из вставленной таблицы.

Рассмотрите эту простую таблицу:

CREATE TABLE [dbo].[SampleTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [InsertDate] [datetime] NOT NULL,
    [Name] [nvarchar](100) NULL
) ON [PRIMARY]

С этим значением по умолчаниюдобавлено:

ALTER TABLE [dbo].[SampleTable] 
    ADD CONSTRAINT [DF_SampleTable_Inserted]  
        DEFAULT (getdate()) FOR [InsertDate]

Вы можете получить значения как по умолчанию, так и идентификатор из операции вставки.

DECLARE @InsertedDetails TABLE (ID int, InsertDate DateTime);

INSERT INTO SampleTable ([Name])
    OUTPUT inserted.ID, inserted.InsertDate 
        INTO @InsertedDetails 
    VALUES ('Fred');

DECLARE @ID int; 
DECLARE @InsertDate datetime;
SELECT @ID = ID, @InsertDate = InsertDate FROM @InsertedDetails;

PRINT @ID;
PRINT @InsertDate;

Здесь я просто извлек значения из табличной переменной и напечатал их.

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