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

Použijte SCOPE_IDENTITY() k vrácení naposledy vložené hodnoty identity ve stejném oboru (SQL Server)

V SQL Server můžete použít T-SQL SCOPE_IDENTITY() funkce vrátit poslední hodnotu identity vloženou do sloupce identity ve stejném oboru.

Rozsah je modul (uložená procedura, spouštěč, funkce nebo dávka). Pokud jsou dva příkazy ve stejné uložené proceduře, funkci nebo dávce, jsou ve stejném oboru.

Všimněte si, že vrací poslední hodnotu identity vygenerovanou v jakékoli tabulce v aktuální relaci . To je v kontrastu s IDENT_CURRENT() funkce, která vrací naposledy vloženou hodnotu identity pro danou tabulku , bez ohledu na to, ve které relaci se nachází.

SCOPE_IDENTITY() je velmi podobný @@IDENTITY tím, že oba vracejí naposledy vloženou hodnotu identity v aktuální relaci. Rozdíl je v tom, že SCOPE_IDENTITY() je omezena na aktuální rozsah, zatímco @@IDENTITY není omezena na konkrétní rozsah.

Příklad 1 – Základní použití

Zde je základní příklad kódu, jak to funguje.

SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Výsledek:

+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+

Důvodem výsledku NULL je to, že jsem příkaz spustil ihned po otevření nového připojení k serveru SQL. SCOPE_IDENTITY() funkce vrací pouze výsledky z aktuální relace.

Abych tedy získal výsledek bez NULL, musím vložit hodnotu do sloupce identity.

Příklad 2 – Vložení hodnoty pro výsledek bez NULL

V tomto příkladu vytvořím tabulku se sloupcem identity. Před výběrem obsahu tabulky a poté spuštěním SCOPE_IDENTITY() do této tabulky vložím výchozí hodnotu znovu.

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

Výsledek:

+------+
| id   |
|------|
| 1    |
+------+
(1 row affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 1                              |
+--------------------------------+
(1 row affected)

Tabulka má jeden řádek a její sloupec identity má hodnotu 1. Toto je poslední vložená hodnota identity pro aktuální relaci, takže SCOPE_IDENTITY() také vrátí 1.

Nyní, když přidám další řádek, hodnota se odpovídajícím způsobem zvýší:

INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Výsledek:

+------+
| id   |
|------|
| 1    |
| 2    |
+------+
(2 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+
(1 row affected)

Výsledky z nové relace

Jak již bylo zmíněno, SCOPE_IDENTITY() vrací pouze výsledky ze stejné relace. To platí také pro @@IDENTITY .

Pokud tedy otevřu nové připojení k SQL Serveru a spustím předchozí SELECT znovu, dostanu následující výsledky:

USE Test;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Výsledek:

+------+
| id   |
|------|
| 1    |
| 2    |
+------+
(2 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| NULL                           |
+--------------------------------+
(1 row affected)

Nyní vložíme nový řádek z této nové relace:

INSERT scope_identity_test DEFAULT VALUES;
SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Výsledek:

+------+
| id   |
|------|
| 1    |
| 2    |
| 3    |
+------+
(1 row affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 3                              |
+--------------------------------+
(3 rows affected)

Takže to dohnalo, jakmile jsem vložil novou hodnotu identity.

Vraťme se však zpět k původní relaci a spusťte SELECT příkazy znovu (bez vložení nového řádku):

SELECT id FROM scope_identity_test;
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];

Výsledek:

+------+
| id   |
|------|
| 1    |
| 2    |
| 3    |
+------+
(3 rows affected)
+--------------------------------+
| Last-Inserted Identity Value   |
|--------------------------------|
| 2                              |
+--------------------------------+
(1 row affected)

Takže SCOPE_IDENTITY() původní relace výsledky nebyly ovlivněny druhým sezením.

Přidání druhého rozsahu

Věc, která odlišuje SCOPE_IDENTITY() z @@IDENTITY , je to SCOPE_IDENTITY() je omezena na aktuální rozsah.

Pokud například tabulka obsahuje spouštěč, který vkládá hodnotu identity do jiné tabulky, SCOPE_IDENTITY() hlásí pouze první hodnotu identity. Ignorovala by hodnotu identity pro druhou tabulku, protože ta byla vytvořena v jiném rozsahu @@IDENTITY na druhé straně by hlásil hodnotu identity pro druhou tabulku (protože pokrývá všechny rozsahy).

Příklad toho, co mám na mysli, viz IDENT_CURRENT vs @@IDENTITY vs SCOPE_IDENTITY v SQL Server:Jaký je rozdíl?

Tento článek prochází příkladem spuštění, jako je to, o čem zde mluvím.


  1. Jak GET_FORMAT() funguje v MariaDB

  2. Kámo, kdo vlastní ten #temp stůl?

  3. 2 způsoby, jak získat den od data v Oracle

  4. ORDER BY ... POUŽITÍ klauzule v PostgreSQL