sql >> Databáze >  >> RDS >> Sqlserver

IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY v SQL Server:Jaký je rozdíl?

V SQL Server, pokud někdy potřebujete vrátit hodnotu vytvořenou ve sloupci identity, máte několik možností. Každá z těchto možností, i když je podobná, dělá trochu jinou věc.

Zejména můžete použít následující funkce:

  • IDENT_CURRENT() vrátí naposledy vloženou hodnotu identity pro danou tabulku.
  • SCOPE_IDENTITY() vrátí poslední hodnotu identity vloženou do sloupce identity v any tabulky v aktuální relaci a aktuálním rozsahu.
  • @@IDENTITY vrátí naposledy vloženou hodnotu identity v any tabulky v aktuální relaci, bez ohledu na rozsah.

Příklad

Zde je příklad, který ukazuje rozdíl mezi těmito třemi funkcemi.

Nejprve vytvořte dvě tabulky. Všimněte si různých počátečních a přírůstkových hodnot používaných pro sloupec identity v každé tabulce:

CREATE TABLE t1(id int IDENTITY(1,1));  
CREATE TABLE t2(id int IDENTITY(150,10));

Nyní vytvořte spouštěč, který vloží řádek do druhé tabulky vždy, když je řádek vložen do první tabulky:

CREATE TRIGGER t1_insert_trigger ON t1 FOR INSERT
AS
BEGIN
  INSERT t2 DEFAULT VALUES
END;

Spouští palbu v jiném rozsahu, takže to je ideální pro můj příklad zde.

Vložte data do první tabulky a poté vyberte výsledky z obou tabulek:

INSERT t1 DEFAULT VALUES;
SELECT id AS t1 FROM t1;
SELECT id AS t2 FROM t2;

Výsledek:

+------+
| t1   |
|------|
| 1    |
+------+
(1 row affected)
+------+
| t2   |
|------|
| 150  |
+------+
(1 row affected)

Aby bylo jasno, tato data byla vložena dvěma různými rozsahy. Vložit do t1 bylo provedeno podle aktuálního rozsahu. Vložit do t2 bylo provedeno spouštěčem, které běželo v jiném rozsahu.

Nyní si vyberme z výše zmíněných funkcí:

SELECT 
  @@IDENTITY AS [@@IDENTITY],
  SCOPE_IDENTITY() AS [SCOPE_IDENTITY()],
  IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')],
  IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];

Výsledek:

+--------------+--------------------+-----------------------+-----------------------+
| @@IDENTITY   | SCOPE_IDENTITY()   | IDENT_CURRENT('t1')   | IDENT_CURRENT('t2')   |
|--------------+--------------------+-----------------------+-----------------------|
| 150          | 1                  | 1                     | 150                   |
+--------------+--------------------+-----------------------+-----------------------+

Výsledek vrácený @@IDENTITY není omezena na rozsah, a proto vrací naposledy vloženou hodnotu identity bez ohledu na rozsah.

SCOPE_IDENTITY() vrátí hodnotu identity z první tabulky, protože to byla poslední vložená hodnota identity v aktuálním rozsahu (spouštěč je mimo aktuální rozsah).

IDENT_CURRENT() funkce jednoduše vrátí poslední hodnotu identity vloženou do zadané tabulky, bez ohledu na rozsah nebo relaci.

Otevřít novou relaci

Nyní se podívejme, co se stane, když otevřu novou relaci a znovu spustím předchozí příkaz:

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')];

Výsledek:

+--------------+--------------------+-----------------------+-----------------------+
| @@IDENTITY   | SCOPE_IDENTITY()   | IDENT_CURRENT('t1')   | IDENT_CURRENT('t2')   |
|--------------+--------------------+-----------------------+-----------------------|
| NULL         | NULL               | 1                     | 150                   |
+--------------+--------------------+-----------------------+-----------------------+

Oba @@IDENTITY a SCOPE_IDENTITY() jsou NULL, protože vracejí pouze výsledky z aktuální relace. V této nové relaci jsem neprovedl žádné vložení sloupce identity, takže dostávám hodnotu NULL.

IDENT_CURRENT() na druhou stranu vrací stejný výsledek jako v předchozím příkladu, opět proto, že jeho výsledky jsou založeny na zadané tabulce bez ohledu na relaci nebo rozsah.


  1. Jak nasadit databázi Chamilo MySQL pro vysokou dostupnost

  2. SQL - Jak vybrat řádek se sloupcem s maximální hodnotou

  3. ExecuteNonQuery:Vlastnost připojení nebyla inicializována.

  4. Jak počítat odlišné hodnoty v SQL