Использование OUTPUT в INSERT SQL для получения ID
Быстрый ответ
Для сохранения нового значения IDENTITY после исполнения операции INSERT
используйте OUTPUT
:
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.
Практическое применение и лучшие практики
Работа с клиентским приложением
Если вы работаете с клиентским приложением и хотите выполнить запрос INSERT
, заодно извлекая значение identity, примените метод .ExecuteScalar()
:
DECLARE @NewID int;
INSERT INTO TargetTable (Col1)
OUTPUT INSERTED.IdentityColumn INTO @NewID
VALUES ('Data');
-- В коде приложения
int id = sqlCommand.ExecuteScalar(); // "Я получил int!"
Получение множества значений Identity
Для вставки нескольких записей и получения их идентификаторов используйте временные или постоянные таблицы:
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 среди остальных строк:
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
– это фотобудка 📸, которая сразу после создания новой записи/фотографии выдаёт вам уникальный билет 🎫:
INSERT INTO People (Name, Age)
OUTPUT INSERTED.ID -- 🎫 Ваш персональный билет!
VALUES ('Alice', 25);
📸 -> 📄 Новая запись -> 🎫 Значение Identity
Благодаря OUTPUT, вы получаете identity-билет сразу после создания записи!
🧩 Таблица People
| ID (🎫) | Имя | Возраст |
|--------|-------|---------|
| 1 | Алиса | 25 | <-- Ваша запись? Вот ваш билет с ID!
Из практики
Мечта аудитора
В сценариях аудита изменений, когда необходимо фиксировать модификации, OUTPUT
позволяет одновременно вести учет старых и новых версий данных:
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, что позволяет создавать записи гибко:
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 в переменной таблицы обычно происходит быстрее, чем в временной, но результат может варьироваться в зависимости от объема данных и параметров сервера.
Полезные материалы
- Клауза OUTPUT (Transact-SQL) – SQL Server | Microsoft Learn — Авторитетное руководство по применению клаузы OUTPUT в SQL Server.
- sql – Как я могу использовать клаузу OUTPUT в INSERT-запросе для получения значения identity? – Stack Overflow — Обсуждения и примеры использования клаузы OUTPUT из расчетов сообщества Stack Overflow.
- Столбцы Identity – Simple Talk — Обзор работы и важности столбцов Identity.
- Таблицы и представления для аудита в SQL Server — Изучение аудита с помощью клаузы OUTPUT.
- – YouTube — Видеообучение по использованию клаузы OUTPUT в SQL Server.