Как вставить в таблицу и вернуть значение первичного ключа?

У меня есть первичный ключ, настроенный на автоматическое увеличение.

Я выполняю несколько запросов, и мне нужно получить это значение первичного ключа для использования в качестве внешнего ключа в другой таблице (IsIdentity = TRUE).

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

Любые предложения?

Ответы

Ответ 1

insert into YourTable values (...)

получить новый PK с scope_identity()

select scope_identity()

Ответ 2

Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать предложение OUTPUT.

create table T(
  pk int identity primary key,
  dat varchar(20)
);
go

insert into T
output inserted.pk
values ('new item');
go

drop table T;

Вывод может быть направлен как на таблицу, так и на клиента. Например:

create table T(
  pk int identity primary key,
  dat varchar(20)
);

create table U(
  i int identity(1001,1) primary key,
  T_pk int not null,
  d datetime
);
go


insert into T
output inserted.pk, getdate()
into U(T_pk,d)
values ('new item'), ('newer item');
go

select * from T;
select * from U;
go

drop table T, U;

Начиная с SQL Server 2008, вы можете использовать "composable DML" для получения дополнительных возможностей.

Ответ 3

INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)

Примечание. Это для MS SQL 2005 и выше

Ответ 4

SCOPE_IDENTITY(), вероятно, вы хотите. Он возвращает идентификатор последней записи, вставленной в тот же контекст кода, в котором он выполняется.

IDENT_CURRENT ('tablename') распространяется на проблемы concurrency. То есть, нет гарантии, что другая запись не будет вставлена ​​между INSERT и вызовом IDENT_CURRENT.

Должен признаться, я не уверен в том, что источник изумления, о котором упоминает VillageIdiot, но я сам очень удивлен тем, что этот вопрос не является дубликатом вообще.

Ответ 5

Святое дерьмо!!!

просто вызовите функцию SCOPE_IDENTITY():

insert into your_talble(col1,col2) values('blah','more blah')
select scope_identity()

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

Ответ 6

Вы должны использовать scope_identity(). И я рекомендую обернуть оператор insert и scope_identity() в транзакцию.