Получение авто-сгенерированного ID после INSERT в SQL Server

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы получить идентификатор только что вставленной записи, следует использовать функцию SCOPE_IDENTITY() непосредственно после инструкции INSERT:

SQL
Скопировать код
INSERT INTO YourTable (Column1, Column2)
VALUES ('Value1', 'Value2');

SELECT SCOPE_IDENTITY();

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

SQL
Скопировать код
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;

Оба эти метода гарантируют сохранность идентификаторов, даже при параллельной работе с базой данных.

Кинга Идем в IT: пошаговый план для смены профессии

Применение: Работа с триггерами

В контексте использования триггеров, например, AFTER INSERT, которые могут добавлять строки в другую таблицу, SCOPE_IDENTITY() помогает предотвратить путаницу с идентификаторами, возвращая корректный ID вновь вставленной записи.

Применение: Вставка нескольких строк

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

Другие методы для получения автоматически генерируемых идентификаторов

В SQL Server имеются также и другие функции для работы с идентификаторами:

  • IDENT_CURRENT('TableName') – возвращает последний ID для таблицы, игнорируя сессию или область.
  • @@IDENTITY – предоставляет последнее значение ID, созданное в текущей сессии, однако может вызывать заблуждение при работе с триггерами и параллельными операциями.

Советы для Entity Framework

В Entity Framework предусмотрены инструменты для автоматической работы с ID после вставки, что сокращает необходимость ручного контроля данного процесса. Важно избегать сложных запросов в EF, поскольку Framework способен оптимизировать их самостоятельно.

Визуализация

Попробуйте представить вендинговый автомат 🏧, который при получении монеты выдаёт вам билет с уникальным номером в качестве подтверждения покупки:

SQL
Скопировать код
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 может сохранять результаты в переменных и временных таблицах, что существенно упрощает дальнешее использование этих данных, например, в рамках транзакций.

Полезные материалы

  1. INSERT (Transact-SQL) – SQL Server | Microsoft Learn – пособие по использованию оператора INSERT.
  2. SCOPE_IDENTITY (Transact-SQL) – SQL Server | Microsoft Learn – руководство по функции SCOPE_IDENTITY().
  3. Identity Columns – Simple Talk – обзор работы с идентификационными столбцами.
  4. Механизмы сетевого взаимодействия для SQL Server – анализ различных механизмов сетевого взаимодействия в SQL Server.
  5. SQL Server – Возврат значения после вставки – обсуждение методов получения ID после вставки на Stack Overflow.