Функция извлечения идентификационных значений в SQL SERVER 2000 В SQL Server 2000 столбец идентичности определяется как IDENTITY, и следующее связано с получением значения идентичности последней вставленной записи
Пример иллюстрации функции off
В SQL Server можно использовать SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() для получения значения последней вставленной записи, и разница между ними такова: SCOPE_IDENTITY() возвращает последнее значение IDENTITY, вставленное внутри столбца IDENTITY в той же области. Область — это модуль — хранящиеся процедуры, триггеры, функции
Номера или партии. Следовательно, если два оператора находятся в одной и той же хранимой процедуре, функции или пакете, они находятся в одной области. @@IDENTITY Возвращает последнее значение идентификации, сгенерированное во всех таблицах текущей сессии IDENT_CURRENT() возвращает последнее значение идентификации, сгенерированное для указанной таблицы в любой сессии и в любой области Вот пример, чтобы проиллюстрировать их различия
-- a) Пример кода -- =========================================== -- Создать тестовую таблицу -- =========================================== ИСПОЛЬЗУЙТЕ tempdb ВПЕРЁД
CREATE TABLE t1(id int IDENTITY, col int) ВСТАВИТЬ T1 SELECT 1 ЮНИОН ALL SELECT 2 CREATE TABLE t2(id int IDENTITY, col int) ВПЕРЁД
СОЗДАТЬ TR_insert_t2 ТРИГГЕРА На T2 ДЛЯ ВСТАВКИ AS ВСТАВИТЬ t1 SELECT 3 ВПЕРЁД
-- =========================================== -- Проверьте три функции: 1 -- =========================================== ВСТАВИТЬ ЗНАЧЕНИЯ T2(1) ВЫБЕРИТЕ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() для t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() для t2]=IDENT_CURRENT(N't2')
/*--Результат SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Для t1 IDENT_CURRENT() Для t2 ------------------ ------------ -------------------------- ----------------------- 1 3 3 1
(Количество затронутых строк — 1 ряд) --*/ ВПЕРЁД
-- =========================================== -- Проверьте три функции: 2 -- =========================================== ВСТАВЬТЕ ЗНАЧЕНИЯ T1(10) ВЫБЕРИТЕ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() для t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() для t2]=IDENT_CURRENT(N't2')
/*--Результат SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Для t1 IDENT_CURRENT() Для t2 ------------------ ------------ -------------------------- ----------------------- 4 4 4 1
(Количество затронутых строк — 1 ряд) --*/ ВПЕРЁД
-- =========================================== -- Проверьте три функции: 3 -- ** Откройте новое соединение и выполните следующий код ** -- =========================================== ВЫБЕРИТЕ [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() для t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() для t2]=IDENT_CURRENT(N't2')
/*--Результат SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Для t1 IDENT_CURRENT() Для t2 ------------------ ------------ -------------------------- ----------------------- NULL NULL 4 &n
--=========================================== -- Удалить тестовую среду -- =========================================== ТАБЛИЦА ВЫБРОСА T1,T2
-- b) Описание результата кода Как видно из приведённого выше кода: IDENT_CURRENT() всегда возвращает последнее идентифицированное значение, вставленное в указанную таблицу @@IDENTITY Возвращает значение идентичности текущей сессии, независимо от того, находится ли она в той же области действия или нет, в тестах 1 и 2 видно, что оно возвращает значение идентификатора вставленной записи в триггере, и в
В тесте 3 возвращается NULL, потому что в текущей сессии нет записи вставки SCOPE_IDENTITY() возвращает значение идентификации того же объёма текущей сессии, поэтому в тесте 1, 2 возвращается значение, не затрагиваемое триггером, а в тесте 3 — поскольку текущая сессия не интерполируется
запись, поэтому возвращает NULL
|