2010-09-13 1 views
6

Кто-нибудь знает, как я могу вернуть @@Identity при использовании T-Sql?T-Sql @@ Identity

Что-то вроде этого:

set @Sql = "insert into table....values()..." 
exec @sql 
return @@Identity 
+1

Что вас среднее значение return @@ Identity? Откуда? И вам действительно нужно @@ Identity или scope_identity? –

+0

Мне нужна точная @@ Identity. –

+0

@user - Итак, если триггер исходной таблицы вставляется в другую таблицу с идентификационным столбцом, вам нужна идентификация для этой второй таблицы? –

ответ

3
INSERT INTO TableName (Field1, Field2, Field3) VALUES (1, 2, 3); 
SELECT SCOPE_IDENTITY(); 

Это многооперационная партия, поэтому я не уверен, что каждая клиентская библиотека вернет значения одинаково; например, в классическом ADO, возможно, вам понадобится перейти к следующему набору записей, прежде чем вы сможете прочитать значение. Но если вы используете ADO.NET, я знаю, что вы можете просто использовать ExecuteScalar на всей строке выше, и она вернет ваше значение SCOPE_IDENTITY просто отлично.

Внимание: ADO.NET вернет значение как decimal, а не int, как и следовало ожидать. Это связано с тем, что SCOPE_IDENTITY, по какой-либо причине, напечатан как numeric(38,0). Таким образом, вам нужно либо выдать результат ExecuteScalar до decimal, прежде чем вы нажмете его на int, или вам понадобится SELECT CAST(SCOPE_IDENTITY() AS INT) (при условии, что поле IDENTITY - это INT, а не какой-то более крупный числовой тип).

+0

Greate. Благодарю. –

+3

Я бы всегда ** использовал SCOPE_IDENTITY, а не @@ IDENTITY –

+0

Я даже не знал о 'SCOPE_IDENTITY', но похоже, что вы правы. Начиная с нескольких минут скимминга, похоже, что некоторые экзотические обстоятельства (например, триггеры INSERT, которые делают больше INSERT в другие таблицы), делают ошибку @ @ IDENTITY неправильной; но все же, вы правы, 'SCOPE_IDENTITY' - это правильная вещь. Я обновил свой ответ. –

5

Как это:

INSERT INTO Table(...) 
OUTPUT INSERTED.IdColumn 
VALUES(...) 
+0

это будет работать в t-sql? при использовании exec @sql? –

+0

Это будет работать в 2008 году и выше. И красота в том, что вы можете повторно использовать и другие поля, если они вам понадобятся. – HLGEM

4

Append "выберите @@ IDENTITY" в вашей вставки заявления:

insert into tab (x,y,z) values (a,b,c); select @@identity 

Возвращаемое значение является ID (использование ExecuteScalar)

+1

Обратите внимание, что использование идентификатора @@ приведет к неправильным результатам, если у вас есть триггер insert, который вставляет строки в другую таблицу с столбцом идентификации. Это безопаснее и надежнее использовать SCOPE_IDENTITY, как предлагает Кен. См. Http://msdn.microsoft.ком/EN-US/библиотека/ms190315.aspx. – EventHorizon

7

Похоже, что одним из ваших неявных требований является выполнение динамического SQL. Хотя я бы посоветовал против этого, вы можете сделать то, что вы ищете с этим:

set @Sql = 'insert into table....values()...; select SCOPE_IDENTITY()' 
exec(@Sql) 
1

Вы можете использовать этот

Insert into Table(Col2, Col3) 
output inserted.Id 
values ('xyz', 'abc') 

Id Где находится ваш идентификатор поля

Смежные вопросы