Использование вывода после вставки для получения значения столбца идентификатора в переменную (не табличное значение)
учитывая следующую простую таблицу испытаний:
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 ответов
помните, что значение предложения output заключается в том, что оно может возвращать более одной записи и более одного поля. Таким образом, вы можете вывести как естественный ключ, так и идентификатор для набора данных, чтобы также использовать теорию множеств для вставки нескольких записей в дочерние таблицы. Вывод очень мощный, и он будет платить, чтобы привыкнуть к его использованию.
в настоящее время существует ошибка в scope_identity () (см. ссылку: http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value) что Microsoft не намерена исправлять. Это должно дать вам ключ к тому, следует ли использовать output для новой разработки, даже если он немного неуклюж для отдельных записей.
нет, это невозможно. Предложение OUTPUT может выводиться только в переменную table / table или использоваться для идентификации столбцов для composable DML (что не помогает). SCOPE_IDENTITY()
полностью, Майкл.