Использование OUTPUT после INSERT для получения значения столбца идентификатора в переменную (не табличное значение) - PullRequest
10 голосов
/ 03 июня 2011

Учитывая следующую простую тестовую таблицу:

CREATE TABLE dbo.Test
(
  Id bigint IDENTITY(1,1) NOT NULL,
  Name varchar(50) NULL
)

Я хотел бы получить значение столбца идентификаторов в скалярной переменной после INSERT, используя предложение OUTPUT, но это неработа:

DECLARE @InsertedId BIGINT;

INSERT INTO Test(Name) 
  OUTPUT @InsertedId=inserted.Id
  VALUES ('Michael')

-- Display resulting id for debugging
SELECT @InsertedId;
-- ...

Я знаю, что могу легко сделать это, используя SCOPE_IDENTITY() после INSERT, но возможно ли сделать это как часть оператора INSERT, используя предложение OUTPUT безприбегнуть к табличной переменной?

Обновление , еще одна искусственная попытка, которая также недопустима:

-- Return the id as a result set
INSERT INTO Test(Name) 
OUTPUT inserted.Id AS TheId
VALUES ('Michael')

-- But you can't use the result set as a derived table...
SELECT TheId FROM
(
  INSERT INTO Test(Name) 
  OUTPUT inserted.Id AS TheId
  VALUES ('Michael')
)

-- ..., or you would be able to do this
SELECT TOP 1 @InsertedId=TheId
FROM
(
  INSERT INTO Test(Name) 
  OUTPUT inserted.Id AS TheId
  VALUES ('Michael')
)

Ответы [ 2 ]

13 голосов
/ 04 июня 2011

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

В настоящее время существует ошибка в scope_identity () (см. Ссылку: http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value), которую Microsoft не собирается исправлять. Это должно дать вам подсказку о том, следует ли использовать вывод для новой разработкидаже если это немного громче для отдельных записей.

6 голосов
/ 03 июня 2011

Нет, это невозможно.Предложение OUTPUT может выводиться только в переменную таблица / таблица или использоваться для идентификации столбцов для составного DML (что не помогает).SCOPE_IDENTITY() полностью, Майкл.

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