В SQL Server, ако някога се наложи да върнете стойността, създадена в колона за идентичност, имате няколко опции. Всяка от тези опции, макар и сходна, прави малко по-различно нещо.
По-специално, можете да използвате следните функции:
IDENT_CURRENT()
връща последно въведената стойност на идентичност за дадена таблица.SCOPE_IDENTITY()
връща последната стойност на идентичност, вмъкната в колона за самоличност в всяко таблица в текущата сесия и текущия обхват.@@IDENTITY
връща последно въведената стойност на идентичност в всяко таблица в текущата сесия, независимо от обхвата.
Пример
Ето пример, който демонстрира разликата между тези три функции.
Първо, създайте две таблици. Обърнете внимание на различните начални стойности и стойности на увеличение, използвани за колоната за идентичност във всяка таблица:
CREATE TABLE t1(id int IDENTITY(1,1)); CREATE TABLE t2(id int IDENTITY(150,10));
Сега създайте тригер, който вмъква ред във втората таблица всеки път, когато се вмъкне ред в първата таблица:
CREATE TRIGGER t1_insert_trigger ON t1 FOR INSERT AS BEGIN INSERT t2 DEFAULT VALUES END;
Задейства се в различен обхват, така че това е идеално за моя пример тук.
Вмъкнете данни в първата таблица, след което изберете резултатите от двете таблици:
INSERT t1 DEFAULT VALUES; SELECT id AS t1 FROM t1; SELECT id AS t2 FROM t2;
Резултат:
+------+ | t1 | |------| | 1 | +------+ (1 row affected) +------+ | t2 | |------| | 150 | +------+ (1 row affected)
Така че само за да е ясно, тези данни бяха вмъкнати от два различни обхвата. Вмъкването в t1 беше направено от настоящия обхват. Вмъкването в t2 беше направено от спусъка, който работи в различен обхват.
Сега нека изберем от гореспоменатите функции:
SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
Резултат:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | 150 | 1 | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
Резултатът, върнат от @@IDENTITY
не е ограничен до обхвата и следователно връща последно въведената стойност на идентичност, независимо от обхвата.
SCOPE_IDENTITY()
връща стойността на самоличността от първата таблица, тъй като това беше последната вмъкната стойност на идентичност в текущия обхват (задействането е извън текущия обхват).
IDENT_CURRENT()
функцията просто връща последната стойност на идентичност, вмъкната в посочената таблица, независимо от обхвата или сесията.
Отворете нова сесия
Ето какво се случва, ако отворя нова сесия и изпълня предишното изявление отново:
USE Test; SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
Резултат:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | NULL | NULL | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
И двете @@IDENTITY
и SCOPE_IDENTITY()
са NULL, защото връщат резултати само от текущата сесия. Не съм извършил никакви вмъквания на колони за идентичност в тази нова сесия, така че получавам NULL.
IDENT_CURRENT()
от друга страна, връща същия резултат като в предишния пример, отново защото резултатите се базират на посочената таблица, независимо от сесията или обхвата.