Получение авто-сгенерированного ID после INSERT в SQL Server
Быстрый ответ
Чтобы получить идентификатор только что вставленной записи, следует использовать функцию SCOPE_IDENTITY() непосредственно после инструкции INSERT:
INSERT INTO YourTable (Column1, Column2)
VALUES ('Value1', 'Value2');
SELECT SCOPE_IDENTITY();
Если же необходимо сохранять все вставляемые значения, используйте оператор OUTPUT, совместно с переменной таблицы:
DECLARE @CapturedValues TABLE (ID INT, Column1 NVARCHAR(100), Column2 NVARCHAR(100));
INSERT INTO YourTable (Column1, Column2)
OUTPUT INSERTED.ID, INSERTED.Column1, INSERTED.Column2 INTO @CapturedValues
VALUES ('Value1', 'Value2');
SELECT * FROM @CapturedValues;
Оба эти метода гарантируют сохранность идентификаторов, даже при параллельной работе с базой данных.
Применение: Работа с триггерами
В контексте использования триггеров, например, AFTER INSERT, которые могут добавлять строки в другую таблицу, SCOPE_IDENTITY() помогает предотвратить путаницу с идентификаторами, возвращая корректный ID вновь вставленной записи.
Применение: Вставка нескольких строк
Когда требуется вставить одновременно несколько строк, SCOPE_IDENTITY() вернёт лишь последний ID, что не всегда подходит. В таком случае будет полезен оператор OUTPUT, позволяющий получить идентификаторы всех вставленных строк, обеспечивая возможность простой последующей работы с ними.
Другие методы для получения автоматически генерируемых идентификаторов
В SQL Server имеются также и другие функции для работы с идентификаторами:
- IDENT_CURRENT('TableName') – возвращает последний ID для таблицы, игнорируя сессию или область.
- @@IDENTITY – предоставляет последнее значение ID, созданное в текущей сессии, однако может вызывать заблуждение при работе с триггерами и параллельными операциями.
Советы для Entity Framework
В Entity Framework предусмотрены инструменты для автоматической работы с ID после вставки, что сокращает необходимость ручного контроля данного процесса. Важно избегать сложных запросов в EF, поскольку Framework способен оптимизировать их самостоятельно.
Визуализация
Попробуйте представить вендинговый автомат 🏧, который при получении монеты выдаёт вам билет с уникальным номером в качестве подтверждения покупки:
INSERT INTO Products (Name, Price) VALUES ('Soda', 1.00);
SELECT SCOPE_IDENTITY();
Сразу после вставки вы получаете подтверждение транзакции с указанием нового ID вставленной записи.
Лирическое отступление: Нечисловые идентификаторы
Оказывается, SQL Server позволяет работать не только с автоинкрементными числовыми ID, но и с GUID. Если используются GUID функций NEWID() или NEWSEQUENTIALID(), оператор OUTPUT поможет получить эти значения после вставки.
Как грамотно использовать оператор OUTPUT INTO
Когда вы используете OUTPUT INTO, важно убедиться, что целевая таблица может принять данные без нарушения уникальности и других ограничений.
Хранение результатов вывода OUTPUT для дальнейшего использования
Оператор OUTPUT может сохранять результаты в переменных и временных таблицах, что существенно упрощает дальнешее использование этих данных, например, в рамках транзакций.
Полезные материалы
- INSERT (Transact-SQL) – SQL Server | Microsoft Learn – пособие по использованию оператора INSERT.
- SCOPE_IDENTITY (Transact-SQL) – SQL Server | Microsoft Learn – руководство по функции SCOPE_IDENTITY().
- Identity Columns – Simple Talk – обзор работы с идентификационными столбцами.
- Механизмы сетевого взаимодействия для SQL Server – анализ различных механизмов сетевого взаимодействия в SQL Server.
- SQL Server – Возврат значения после вставки – обсуждение методов получения ID после вставки на Stack Overflow.