В SQL Server можете да използвате T-SQL SCOPE_IDENTITY()
функция за връщане на последната стойност на идентичност, вмъкната в колона за идентичност в същия обхват.
Обхватът е модул (запазена процедура, тригер, функция или партида). Ако два израза са в една и съща съхранена процедура, функция или партида, те са в един и същ обхват.
Имайте предвид, че връща последната стойност на идентичност, генерирана в която и да е таблица в текущата сесия . Това е в контраст с IDENT_CURRENT()
функция, която връща последно въведената стойност на идентичност за дадена таблица , независимо в коя сесия е.
SCOPE_IDENTITY()
е много подобен на @@IDENTITY
в това, че и двете връщат последно въведената стойност на идентичност в текущата сесия. Разликата е, че SCOPE_IDENTITY()
е ограничен до текущия обхват, докато @@IDENTITY
не се ограничава до конкретен обхват.
Пример 1 – Основна употреба
Ето един основен пример за код за това как работи.
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Резултат:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+
Причината за резултата NULL е, че изпълних оператора веднага след отваряне на нова връзка към SQL Server. SCOPE_IDENTITY()
функцията връща само резултати от текущата сесия.
Така че, за да получа резултат, различен от NULL, трябва да вмъкна стойност в колона за идентичност.
Пример 2 – Вмъкване на стойност за резултат, който не е NULL
В този пример създавам таблица с колона за идентичност. След това вмъквам стойност по подразбиране в тази таблица, преди да избера съдържанието на таблицата и след това стартирам SCOPE_IDENTITY()
отново.
CREATE TABLE scope_identity_test(id int IDENTITY(1,1)); INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Резултат:
+------+ | id | |------| | 1 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 1 | +--------------------------------+ (1 row affected)
Таблицата има един ред и колоната за идентичност има стойност 1. Това е последната вмъкната стойност на идентичност за текущата сесия и така SCOPE_IDENTITY()
също връща 1.
Сега, ако добавя още един ред, стойността се увеличава съответно:
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Резултат:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
Резултати от нова сесия
Както бе споменато, SCOPE_IDENTITY()
връща само резултати от същата сесия. Това важи и за @@IDENTITY
.
Така че, ако отворя нова връзка към SQL Server и стартирам предишния SELECT
отново, получавам следните резултати:
USE Test; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Резултат:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+ (1 row affected)
Сега нека вмъкнем нов ред от тази нова сесия:
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Резултат:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 3 | +--------------------------------+ (3 rows affected)
Така че се настигна веднага щом вмъкнах нова стойност на самоличността.
Нека обаче се върнем към оригиналната сесия и да стартираме SELECT
отново изрази (без да вмъквате нов ред):
SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
Резултат:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (3 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
Така че SCOPE_IDENTITY()
на оригиналната сесия резултатите не са повлияни от втората сесия.
Добавяне на втори обхват
Нещото, което отличава SCOPE_IDENTITY()
от @@IDENTITY
, това е SCOPE_IDENTITY()
е ограничен до настоящия обхват.
Например, ако таблицата има тригер, който вмъква стойност на идентичност в друга таблица, SCOPE_IDENTITY()
ще докладва само първата стойност на идентичността. Ще игнорира стойността на идентичността за втората таблица, тъй като тя е създадена в различен обхват @@IDENTITY
от друга страна, ще отчете стойността на идентичността за втората таблица (тъй като покрива всички обхвати).
За пример за това, което имам предвид, вижте IDENT_CURRENT срещу @@IDENTITY срещу SCOPE_IDENTITY в SQL Server:Каква е разликата?
Тази статия разглежда пример за задействане като това, за което говоря тук.