Все замечательно, но в подобном подходе с сессиями
есть один, довольно серьезный недостаток. Если на таблице с автоинкрементным
столбцом висит какой-нибудь триггер на вставку, который, в свою очередь, что-то
кому-то вставляет, то @@IDENTITY вернет не значение, записанное сервером в
оригинальную таблицу, а то значение, которое будет записано после второй
вставки в триггере, так как формально это все еще та же сессия.
Для того чтобы избежать таких неприятностей, служит
SCOPE_IDENTITY(), который возвращает значение, записанное сервером в автоинкрементный
столбец не только в рамках сессии, но и в рамках текущего пакета (batch).
-- еще одна табличка с автоинкрементом
CREATE TABLE Ident2(ID int IDENTITY(0, -2), value varchar(50))
GO
-- триггер на вставку к
первоначальной табличке
CREATE TRIGGER IdentTrigger ON Ident_table
FOR INSERT
AS
INSERT INTO Ident2 (value) VALUES(GetDate())
GO
-- добавление еще одной записи
INSERT INTO Ident_table (some_values) VALUES ('value 7')
-- наслаждение результатом...
SELECT @@IDENTITY as [Last ID in session (@@IDENTITY)]
SELECT SCOPE_IDENTITY() as [Last ID in batch (SCOPE_IDENTITY())]
SELECT * FROM Ident_table
--- результат:
Рекомендуем скачать другие рефераты по теме: скачать доклад на тему, решебник по математике класс виленкин.