Используя OUTPUT после INSERT, чтобы получить значение столбца идентификации в переменной (не в таблице)

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

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')
)

Ответ 1

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

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

Ответ 2

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