Чтение данных при вставке новых записей

Типичной задачей при вставке новых записей в базу данных (INSERT, SELECT INTO) является контрольное чтение данных для получения актуальной версии. Поскольку могут работать триггеры и могут быть установлены значения по умолчанию.

Чтение идентификаторов
Особый случай это чтение идентификаторов для таблиц, у которых установлено автоматическое присваивание их значений, например, с помощью опции IDENTITY, которая обычно задается для первичного ключа таблицы. В разных версиях сервера базы данных Microsoft SQL Server для этого использовались разные техники. Старый способ это считывание значения глобальной переменной @@IDENTITY. Но этот вариант надежно работает только в простых случаях, когда мы не используем триггеры на вставку записей.

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

Тем не менее, эти функции работают только для целочисленных идентификаторов, не позволяют получить значения других полей, и не могут возвращать список идентификаторов при вставке нескольких записей.

Универсальная техника
Команды модификации данных, в т.ч. и INSERT могут содержать предложение OUTPUT, позволяющее получить актуальные данные, которые содержатся в таблице после вставки новых записей. Это работает как для получения значений идентификаторов, так и любых других столбцов таблицы.

Демонстрационный пример