Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

IDENT_CURRENT срещу @@IDENTITY срещу SCOPE_IDENTITY в SQL Server:Каква е разликата?

В 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() от друга страна, връща същия резултат като в предишния пример, отново защото резултатите се базират на посочената таблица, независимо от сесията или обхвата.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. В SQL, как можете да групирате по диапазони?

  2. Как да се свържете с екземпляр на SQL Server чрез използване на удостоверяване на Windows или удостоверяване на SQL Server - SQL Server / T-SQL урок, част 3

  3. Как мога да попълня колона с произволни числа в SQL? Получавам една и съща стойност във всеки ред

  4. Кога да използвате клъстерни или неклъстерни индекси в SQL Server

  5. Методи за класиране на редове в SQL Server:ROW_NUMBER(), RANK(), DENSE_RANK() и NTILE()