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

Използвайте SCOPE_IDENTITY(), за да върнете последно въведената стойност на самоличността в същия обхват (SQL сървър)

В 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:Каква е разликата?

Тази статия разглежда пример за задействане като това, за което говоря тук.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL заявка за показване на дефиниция на таблица?

  2. SQL Server 2008 Ред вмъкване и актуализиране на времеви печати

  3. sp_executesql е бавен с параметри

  4. Вземете началната и крайната дата на седмицата от номера на седмицата

  5. Автоматизиране на обработката на табличен модел на бази данни на услугите за анализ (SSAS) в SQL Server