Кто-нибудь знает, как я могу вернуть @@Identity
при использовании T-Sql?T-Sql @@ Identity
Что-то вроде этого:
set @Sql = "insert into table....values()..."
exec @sql
return @@Identity
Кто-нибудь знает, как я могу вернуть @@Identity
при использовании T-Sql?T-Sql @@ Identity
Что-то вроде этого:
set @Sql = "insert into table....values()..."
exec @sql
return @@Identity
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, а не какой-то более крупный числовой тип).
Greate. Благодарю. –
Я бы всегда ** использовал SCOPE_IDENTITY, а не @@ IDENTITY –
Я даже не знал о 'SCOPE_IDENTITY', но похоже, что вы правы. Начиная с нескольких минут скимминга, похоже, что некоторые экзотические обстоятельства (например, триггеры INSERT, которые делают больше INSERT в другие таблицы), делают ошибку @ @ IDENTITY неправильной; но все же, вы правы, 'SCOPE_IDENTITY' - это правильная вещь. Я обновил свой ответ. –
Как это:
INSERT INTO Table(...)
OUTPUT INSERTED.IdColumn
VALUES(...)
это будет работать в t-sql? при использовании exec @sql? –
Это будет работать в 2008 году и выше. И красота в том, что вы можете повторно использовать и другие поля, если они вам понадобятся. – HLGEM
Append "выберите @@ IDENTITY" в вашей вставки заявления:
insert into tab (x,y,z) values (a,b,c); select @@identity
Возвращаемое значение является ID (использование ExecuteScalar)
Обратите внимание, что использование идентификатора @@ приведет к неправильным результатам, если у вас есть триггер insert, который вставляет строки в другую таблицу с столбцом идентификации. Это безопаснее и надежнее использовать SCOPE_IDENTITY, как предлагает Кен. См. Http://msdn.microsoft.ком/EN-US/библиотека/ms190315.aspx. – EventHorizon
Похоже, что одним из ваших неявных требований является выполнение динамического SQL. Хотя я бы посоветовал против этого, вы можете сделать то, что вы ищете с этим:
set @Sql = 'insert into table....values()...; select SCOPE_IDENTITY()'
exec(@Sql)
Вы можете использовать этот
Insert into Table(Col2, Col3)
output inserted.Id
values ('xyz', 'abc')
Id
Где находится ваш идентификатор поля
Что вас среднее значение return @@ Identity? Откуда? И вам действительно нужно @@ Identity или scope_identity? –
Мне нужна точная @@ Identity. –
@user - Итак, если триггер исходной таблицы вставляется в другую таблицу с идентификационным столбцом, вам нужна идентификация для этой второй таблицы? –