Intereting Posts
Как определить общее количество открытых / активных подключений в ms sql server 2005 LastIndexOf в LINQ для объектов Каков предпочтительный способ определить, существует ли хранимая процедура Задайте значение MS Sql в переменной и повторно используйте его Использовать значение NULL в UNPIVOT Функция базы данных VS Case Statement SQL Server: проверьте, является ли переменная пустой или NULL для предложения WHERE Получить дату завтра Что вызывает «Неустранимые ошибки внутреннего соединения» Оконные функции могут отображаться только в предложениях SELECT или ORDER BY Вопрос о возврате SQL Server Parent / Child CTE Производительность SQL Server с большим запросом Есть ли способ получить значение DateTime из столбца типа timestamp? База данных SQL Server – Как обрабатывать таблицу, которая МОЖЕТ быть связана с любым количеством других таблиц? Проблема с строкой соединения с новым шаблоном сайта ASP.Net

@@ IDENTITY, SCOPE_IDENTITY (), OUTPUT и другие методы получения последней идентификации

Я видел различные методы, используемые при получении значения поля идентификации первичного ключа после вставки.

declare @t table ( id int identity primary key, somecol datetime default getdate() ) insert into @t default values select SCOPE_IDENTITY() --returns 1 select @@IDENTITY --returns 1 

Возврат таблицы тождеств после вставки:

 Create Table #Testing ( id int identity, somedate datetime default getdate() ) insert into #Testing output inserted.* default values 

Какой метод является правильным или лучше? Является ли метод OUTPUT незаметным?

Второй фрагмент кода был заимствован из SQL в Wild

Solutions Collecting From Web of "@@ IDENTITY, SCOPE_IDENTITY (), OUTPUT и другие методы получения последней идентификации"

Это зависит от того, что вы пытаетесь сделать …

@@ IDENTITY

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

SCOPE_IDENTITY ()

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

IDENT_CURRENT ()

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

Обратите внимание, что в идентификаторах scope_identity () и @@ есть ошибка: см. Соединение: https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

Цитата (от Microsoft):

«Я очень рекомендую использовать OUTPUT вместо @@ IDENTITY во всех случаях. Это лучший способ прочитать идентификатор и метку времени».

Отредактировано для добавления: теперь это может быть исправлено, Connect сообщает мне об ошибке, но смотри:

Scope_Identity () исправляет неверное значение?

@@ Идентичность – это старая школа. Используйте SCOPE_IDENTITY () во всех случаях в будущем. См. MSDN, чтобы использовать @@ IDENTITY (они плохие!).

Существует почти никакой причины использовать что-либо помимо предложения OUTPUT при попытке получить идентификатор только что вставленных строк. Предложение OUTPUT является областью действия и таблицей.

Вот простой пример получения идентификатора после вставки одной строки …

 DECLARE @Inserted AS TABLE (MyTableId INT); INSERT [MyTable] (MyTableColOne, MyTableColTwo) OUTPUT Inserted.MyTableId INTO @Inserted VALUES ('Val1','Val2') SELECT MyTableId FROM @Inserted 

Подробные документы для предложения OUTPUT: http://technet.microsoft.com/en-us/library/ms177564.aspx


 -- table structure for example: CREATE TABLE MyTable ( MyTableId int NOT NULL IDENTITY (1, 1), MyTableColOne varchar(50) NOT NULL, MyTableColTwo varchar(50) NOT NULL ) 

В SQL Server 2005 есть еще один метод, который описан в SQL в Wild .

Это позволит вам получить несколько идентификаторов после вставки. Вот код из сообщения в блоге:

 Create Table #Testing ( id int identity, somedate datetime default getdate() ) insert into #Testing output inserted.* default values 

Небольшая поправка к ответу Годеке:

Это не просто триггеры, о которых вам нужно беспокоиться. Любая вложенная операция, такая как хранимые процедуры, которая создает идентификаторы, может изменить значение @@ IDENTITY.

Еще одно голосование за scope_identity …

SCOPE_IDENTITY достаточно для одиночных строк и рекомендуется, за исключением случаев, когда вам почему-то нужно видеть результат промежуточного TRIGGER (почему?).

Для нескольких строк OUTPUT / OUTPUT INTO является вашим новым лучшим другом и альтернативой повторной установке строк и вставке в другую таблицу.

Будьте полезны при использовании @@ IDENTITY …

http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/