Sql identity sql server: IDENTITY (Property) (Transact-SQL) — SQL Server

SQL Server IDENTITY Сравнение системных функций

Автор: Ahmad Yaseen   |
Комментарии (4)   | Связанный: Еще > Личности

Проблема

Столбец SQL Server IDENTITY — это особый тип столбца, который используется для автоматического
генерировать ключевые значения на основе предоставленного начального значения (начальной точки) и приращения. SQL
Сервер предоставляет нам ряд функций, которые работают со столбцом IDENTITY.
В этом совете мы рассмотрим эти функции с примерами.

Решение

Из-за важности и широкого использования столбца IDENTITY существует
количество системных функций, которые помогают нам работать со столбцом IDENTITY. Большинство
общими функциями являются @@IDENTITY, SCOPE_IDENTITY, IDENT_CURRENT и IDENTITY. Пока
функции @@IDENTITY, SCOPE_IDENTITY и IDENT_CURRENT возвращают значения,
вставляются в столбец идентификаторов таблиц, есть несколько отличий
между этими функциями, которые мы обсудим в этом совете.

SQL Server @@IDENTITY Функция

@@IDENTITY — это системная функция, которая возвращает последнее сгенерированное значение IDENTITY.
для любой таблицы со столбцом идентификаторов в текущем сеансе, независимо от
область оператора T-SQL, сгенерировавшего значение. Другими словами, если у вас есть
несколько строк, созданных с использованием разных
операции ВСТАВИТЬ, ВЫБРАТЬ В или МАССОВОЕ КОПИРОВАНИЕ,
функция @@IDENTITY вернет последнее значение идентификатора, сгенерированное в конце
последней операции. Если эти операторы не повлияли ни на одну таблицу с
identity, функция @@IDENTITY вернет значение NULL.

Функция SQL Server SCOPE_IDENTITY()

Функция SCOPE_IDENTITY() возвращает последнее сгенерированное значение IDENTITY
для любой таблицы со столбцом идентификаторов в текущем соединении, явно
операторы, работающие в текущей области. Область применения может быть
хранимая процедура,
функция, а
триггер или пакет запросов. Это означает, что SCOPE_IDENTITY()
Функция работает так же, как @@IDENTITY, но ограничена определенной областью. Если нет
вставлять
оператор выполняется в таблице со столбцом идентификаторов перед вызовом SCOPE_IDENTITY()
функция, она вернет значение NULL.

SQL Server IDENT_CURRENT (имя таблицы) Функция

Функция IDENT_CURRENT возвращает последнее значение IDENTITY, сгенерированное для определенного
таблицу при любом подключении, независимо от области действия оператора T-SQL, который
сгенерировал это значение. Другими словами, функция IDENT_CURRENT ограничена только
к конкретной таблице, не затрагиваясь соединением или областью действия.

Подводя итог тому, что мы обсуждали ранее, как SCOPE_IDENTITY, так и @@IDENTITY
функции будут возвращать последние значения идентификаторов, сгенерированные в любой таблице в текущем
сессия. Функция SCOPE_IDENTITY вернет значения, вставленные в
только текущая область. Функция @@IDENTITY не ограничена определенной областью действия.
Для IDENT_CURRENT вы должны указать таблицу, которую вам нужно проверить на наличие
последнее значение идентификатора.

Примеры удостоверений SQL Server

Давайте проверим отличия этих функций. Мы создадим две новые таблицы
со столбцами IDENTITY, первый с начальным значением, равным 1, и вторая таблица
с начальным значением, равным 10. Обе таблицы имеют приращение, равное 1.

Таблицы можно создать с помощью приведенного ниже сценария T-SQL:

 ИСПОЛЬЗОВАТЬ MSSQLTipsDemo
ИДТИ
СОЗДАТЬ ТАБЛИЦУ ID_Test
(
ID INT IDENTITY (1,1) ПЕРВИЧНЫЙ КЛЮЧ,
EmpName nvarchar(50)
)

СОЗДАТЬ ТАБЛИЦУ SecondID_Test
(
ID INT IDENTITY (10,1) ПЕРВИЧНЫЙ КЛЮЧ,
CourName nvarchar(50)
)
 

Таблицы созданы, и теперь мы можем проверить текущее значение идентификатора для
две таблицы, используя функцию IDENT_CURRENT, указав имя таблицы, как показано
ниже:

 ВЫБРАТЬ IDENT_CURRENT('ID_Test') КАК ID_TestCurrentID
ИДТИ
ВЫБЕРИТЕ IDENT_CURRENT('SecondID_Test') AS SecondID_TestCurrentID
ИДТИ
 

Результат покажет нам, что текущее значение идентификатора для каждой таблицы равно
к предоставленному начальному значению, поскольку еще не было вставлено ни одной записи:

Мы вставим четыре записи в первую таблицу и три записи во вторую
таблица с помощью операторов INSERT ниже:

 ВСТАВИТЬ В ID_Test (EmpName) ЗНАЧЕНИЯ ('ALI'),('Mohd'),('Джек'),('Джон')
ВСТАВИТЬ В ЗНАЧЕНИЯ SecondID_Test (CourName) («Фейсал»), («Заки»), («Санта»)
 

Давайте снова проверим текущие значения идентификаторов после процесса вставки, используя
функция IDENT_CURRENT:

 ВЫБРАТЬ IDENT_CURRENT('ID_Test') КАК ID_TestCurrentID
ИДТИ
ВЫБЕРИТЕ IDENT_CURRENT('SecondID_Test') AS SecondID_TestCurrentID
ИДТИ
 

Как и ожидалось, начальное значение идентификатора для первой таблицы будет увеличено на четыре.
и второй стол на три. Результат функции IDENT_CURRENT покажет текущий
идентификатор для каждой таблицы, как показано ниже:

Если мы проверим результат функции @@IDENTITY после процесса вставки:

 ВЫБРАТЬ @@IDENTITY AS IDNT
 

Функция вернет последнее значение идентификатора, сгенерированное из двух вставок.
операторов, что равно 12 из второй таблицы:

Результат функции SCOPE_IDENTITY будет похож на результат функции @@IDENTITY
результат, так как генерация идентификатора выполняется только в текущей области действия, т.к.
показано ниже:

 ВЫБЕРИТЕ SCOPE_IDENTITY() КАК ScopeID
 

Если мы попытаемся вставить еще две записи в первую таблицу:

 ВСТАВИТЬ В ID_Test (EmpName) ЗНАЧЕНИЯ («Заид»), («Клод»)
 

И проверьте текущее значение идентификатора для обеих таблиц, используя IDENT_CURRENT
функция:

 ВЫБЕРИТЕ IDENT_CURRENT('ID_Test') КАК ID_TestCurrentID
ИДТИ
ВЫБЕРИТЕ IDENT_CURRENT('SecondID_Test') AS SecondID_TestCurrentID
ИДТИ
 

Значение идентификатора для первой таблицы будет увеличено на два, а идентификатор
значение для второй таблицы не изменится:

Повторная проверка результата функции @@IDENTITY:

 ВЫБРАТЬ @@IDENTITY AS IDNT
 

Результат покажет последнее значение идентификатора, сгенерированное в текущем соединении:

Это похоже на результат функции SCOPE_IDENTITY, так как оператор вставки
выполняется только в текущем объеме:

 ВЫБЕРИТЕ SCOPE_IDENTITY() КАК ScopeID
 

Что также равно 6 для функции SCOPE_IDENTITY:

Предположим, что у нас есть приведенный ниже триггер, который вставляет новую запись во вторую
table каждый раз, когда мы выполняем операцию вставки в первую таблицу:

 CREATE TRIGGER IDTrigger ON ID_Test FOR INSERT
КАК
НАЧИНАТЬ
   ВСТАВЬТЕ ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ SecondID_Test
КОНЕЦ;
 

Если мы попытаемся вставить новую запись в первую таблицу, выходное сообщение будет
показать, что есть две записи, вставленные этим оператором INSERT. Первый
в таблицу ID_Test, а второй — в SecondID_Test из триггера.

Проверка текущего значения идентификатора для обеих таблиц с помощью функции IDENT_CURRENT:

 ВЫБРАТЬ IDENT_CURRENT('ID_Test') КАК ID_TestCurrentID
ИДТИ
ВЫБЕРИТЕ IDENT_CURRENT('SecondID_Test') AS SecondID_TestCurrentID
ИДТИ
 

Результат покажет, что значение идентификатора для обеих таблиц увеличилось на единицу.
после предыдущего процесса вставки:

Сравнение результата функций @@IDENTITY и SCOPE_IDENTITY:

 ВЫБРАТЬ @@IDENTITY AS IDNT
ИДТИ
ВЫБЕРИТЕ SCOPE_IDENTITY() КАК ScopeID
ИДТИ
 

Вы увидите, что функция @@IDENTITY возвращает последний сгенерированный идентификатор
значение, независимо от области, которая генерирует это значение, это означает, что оно возвращает
значение идентификатора, сгенерированное оператором вставки, выполненным триггером, который
значение, вставленное во вторую таблицу.

Но SCOPE_IDENTITY возвращает последнее значение идентификатора, сгенерированное в текущем
только область действия, то есть значение, вставленное в первую таблицу с помощью первого оператора INSERT.
заявление, как показано ниже:

Наконец, если вы проверите результаты функций @@IDENTITY и SCOPE_IDENTITY,
отдельное окно запроса без выполнения какой-либо другой операции, возвращаемый результат
из обеих функций будет NULL. Это связано с тем, что в
этот сеанс на любой таблице со столбцом IDENTITY:

Функция ИДЕНТИФИКАЦИИ SQL Server

Другая функция, работающая со значением идентификатора, — это функция IDENTITY.
Это отличается от свойства IDENTITY, которое используется в CREATE TABLE или
Операторы ALTER TABLE. Эта функция используется для вставки идентификационных значений в
новую таблицу с помощью инструкции SELECTINTO T-SQL.

Вам необходимо указать допустимый тип данных для столбца идентификации из целого числа
категории типов данных (битовые и десятичные типы данных не допускаются). Вам необходимо предоставить
функция IDENTITY с начальным значением и значениями приращения для столбца идентификаторов
и, наконец, имя столбца, который будет вставлен в новую таблицу.

Предположим, что нам нужно создать новую таблицу, содержащую столбец идентификаторов и
столбец EmpName из созданной ранее таблицы ID_Test. СЕЛЕКТИНО
Оператор T-SQL ниже можно использовать для создания новой таблицы с необходимыми данными:

 SELECT IDENTITY(int, 1,1) AS Ident, [EmpName]
INTO NewIdenTable
ОТ ID_Test;
ИДТИ
 

Проверка данных новых таблиц с помощью приведенного ниже оператора SELECT:

 ВЫБЕРИТЕ * ИЗ НьюИденТабле
ИДТИ
 

Семь записей из исходной таблицы будут вставлены в новую таблицу как
показано ниже:

Результат, возвращаемый функциями IDENT_CURRENT, @@IDENTITY и SCOPE_IDENTITY
будет таким же для новой таблицы, так как все сгенерированные значения идентификаторов предназначены для
та же таблица в текущей области:

 ВЫБЕРИТЕ IDENT_CURRENT('NewIdenTable') AS NewIdenTableCurrentID
ИДТИ
ВЫБЕРИТЕ @@IDENTITY AS IDNT
ИДТИ
ВЫБЕРИТЕ SCOPE_IDENTITY() КАК ScopeID
ИДТИ
 

Результат будет следующим:

SQL Server ВЫВОД, пункт

Предложение OUTPUT используется в основном для возврата информации о строках
на которые влияют команды INSERT, UPDATE, DELETE или MERGE T-SQL. Вы можете легко
извлечь выгоду из захваченного результата, вставив его в другую временную таблицу или
table переменная, чтобы использовать данные позже в вашей логике. Предложение OUTPUT является хорошим
и рекомендуемая альтернатива функции SCOPE_IDENTITY, так как ее можно использовать
чтобы вернуть новое значение идентификатора, вставленное в определенную таблицу.
Давайте обрежем созданную ранее таблицу ID_test, создадим временную таблицу для
разместить вставленные значения идентификаторов и вставить в эту таблицу четыре новые строки. Этот
когда оператор INSERT будет содержать новое предложение OUTPUT INTO, которое используется
для записи значений ID, которые вставляются в созданную временную таблицу. T-SQL
script, который используется для достижения этого, будет следующим:

 ИСПОЛЬЗОВАТЬ MSSQLTipsDemo
ИДТИ
TRUNCATE ТАБЛИЦА ID_Test

CREATE TABLE #TempIDs (ID INT)

INSERT INTO ID_Test (EmpName) OUTPUT INSERTED.ID INTO #TempIDs VALUES
(«Саед»), («Аммар»), («Луай»), («Джаад»)

ВЫБЕРИТЕ МАКС.  (ID) КАК LastID ИЗ #TempIDs

УДАЛИТЬ ТАБЛИЦУ #TempID
 

Напомним, что оператор TRUNCATE удалит все записи из таблицы
и сбросить начальное значение идентификатора. После вставки четырех новых записей последняя
вставленное значение идентификатора в области запроса будет равно 4, как показано ниже:

Следующие шаги
  • Потратьте некоторое время на тестирование этих или других примеров в вашей среде.
    наряду с этими различными функциями, чтобы лучше понять, как они
    работу и значения, которые возвращаются.
  • Подробнее

    Советы по столбцу идентификации SQL Server.

Об авторе

Ахмад Ясин — администратор базы данных SQL Server со степенью бакалавра компьютерной инженерии, а также опытом разработки .NET.

Посмотреть все мои советы

База данных

. Что означает свойство столбца «Идентификация» в SQL Server?

спросил

Изменено
6 лет, 9несколько месяцев назад

Просмотрено
45 тысяч раз

Я впервые использую SQL Server и вижу, что свойство столбца называется Is Identity .

Что это значит?

Каковы преимущества пометки свойства столбца как Is Identity = Yes ?

  • sql-server
  • база данных
  • свойства

Это просто означает, что столбец использует Identity(seed, increment) функция для предоставления значений для первичного ключа (обычно). Он также известен как «Автонумерация». Вторая строка ниже является примером:

 CREATE TABLE Table (
TableID bigint IDENTITY(1,1) NOT NULL,
DateTimeStamp datetime НЕ NULL ПО УМОЛЧАНИЮ (getdate()),
Данные nvarchar(100) НЕ NULL,
CONSTRAINT PK_Table PRIMARY KEY CLUSTERED
(
    Идентификатор таблицы ASC
)
 

Действует как значение по умолчанию для столбца, которое увеличивается для каждой записи. Обратите внимание, что вы также можете получить значение, вставленное из SCOPE_IDENTITY(). Не используйте @@IDENTITY, так как он устарел и может вернуть неправильный результат в случае триггеров или вложенных контекстов.

Флаг, указывающий на столбец идентификаторов — может использоваться в качестве столбца с автоинкрементом (рекомендуется для любой таблицы)

имеет много значений, таких как возможность получить идентификатор последней вставленной строки в таблицу с помощью @@IDENTITY или SCOPE_IDENTITY () и т.