Использование OUTPUT в INSERT SQL для получения ID

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

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

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

Для сохранения нового значения IDENTITY после исполнения операции INSERT используйте OUTPUT:

SQL
Скопировать код
DECLARE @ID table (NewID int);

INSERT INTO TargetTable (Col1)
OUTPUT INSERTED.IdentityColumn INTO @ID
VALUES ('Data');

SELECT * FROM @ID;  -- Вот ваш новый identity!

Замените TargetTable, Col1, IdentityColumn и 'Data' на соответствующие значения из вашей таблицы. Таким образом, новое значение IDENTITY будет занесено в переменную @ID.

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

Практическое применение и лучшие практики

Работа с клиентским приложением

Если вы работаете с клиентским приложением и хотите выполнить запрос INSERT, заодно извлекая значение identity, примените метод .ExecuteScalar():

SQL
Скопировать код
DECLARE @NewID int;

INSERT INTO TargetTable (Col1)
OUTPUT INSERTED.IdentityColumn INTO @NewID
VALUES ('Data');

-- В коде приложения
int id = sqlCommand.ExecuteScalar();  // "Я получил int!"

Получение множества значений Identity

Для вставки нескольких записей и получения их идентификаторов используйте временные или постоянные таблицы:

SQL
Скопировать код
CREATE TABLE #TempIDs (ID int);

INSERT INTO TargetTable (Col1, Col2, ...)
OUTPUT INSERTED.IdentityColumn INTO #TempIDs
VALUES ('Data1', 'Data2', ...),
       ('Data3', 'Data4', ...),
       ...;

SELECT ID FROM #TempIDs;  // "Все временные ID на выход!"

Аккуратность в сложных вставках

Если вы используете операцию JOIN в команде INSERT, выберите точные нужные значения identity среди остальных строк:

SQL
Скопировать код
INSERT INTO TargetTable (Col1, Col2, ...)
OUTPUT INSERTED.IdentityColumn, INSERTED.Col1, INSERTED.Col2 INTO @ID(NewID, Col1, Col2)
SELECT SourceTable.Col1, SourceTable.Col2, ...
FROM SourceTable
WHERE SourceTable.Col1 = 'Criteria'; // "Выбираем ID из массы данных"

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

Представьте, что команда INSERT – это фотобудка 📸, которая сразу после создания новой записи/фотографии выдаёт вам уникальный билет 🎫:

SQL
Скопировать код
INSERT INTO People (Name, Age)
OUTPUT INSERTED.ID  -- 🎫 Ваш персональный билет!
VALUES ('Alice', 25);
Markdown
Скопировать код
📸 -> 📄 Новая запись -> 🎫 Значение Identity

Благодаря OUTPUT, вы получаете identity-билет сразу после создания записи!

Markdown
Скопировать код
🧩 Таблица People
| ID (🎫) | Имя   | Возраст |
|--------|-------|---------|
|   1    | Алиса |   25    | <-- Ваша запись? Вот ваш билет с ID!

Из практики

Мечта аудитора

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

SQL
Скопировать код
DECLARE @AuditTable TABLE (ActionType nvarchar(100), OldID int, NewID int);

INSERT INTO TargetTable (Col1)
OUTPUT 'INSERTED', NULL, INSERTED.IdentityColumn INTO @AuditTable
VALUES ('Data');

-- Позволяет сохранить историю изменений вместе с identity-значениями

Условные вставки

Когда речь идет о условной логике вставки, OUTPUT помогает зафиксировать значения identity, что позволяет создавать записи гибко:

SQL
Скопировать код
IF NOT EXISTS(SELECT * FROM TargetTable WHERE Col1 = 'SomeData')
BEGIN
    INSERT INTO TargetTable (Col1)
    OUTPUT INSERTED.IdentityColumn INTO @ID
    VALUES ('SomeData');
END

SELECT * FROM @ID;  // "Если запись создана, то '@ID' у нас в кармане!"

Производительность на первом месте!

В операциях с большим объемом данных обращайте внимание на производительность. Сохранение значений identity в переменной таблицы обычно происходит быстрее, чем в временной, но результат может варьироваться в зависимости от объема данных и параметров сервера.

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

  1. Клауза OUTPUT (Transact-SQL) – SQL Server | Microsoft LearnАвторитетное руководство по применению клаузы OUTPUT в SQL Server.
  2. sql – Как я могу использовать клаузу OUTPUT в INSERT-запросе для получения значения identity? – Stack Overflow — Обсуждения и примеры использования клаузы OUTPUT из расчетов сообщества Stack Overflow.
  3. Столбцы Identity – Simple Talk — Обзор работы и важности столбцов Identity.
  4. Таблицы и представления для аудита в SQL Server — Изучение аудита с помощью клаузы OUTPUT.
  5. – YouTube — Видеообучение по использованию клаузы OUTPUT в SQL Server.