Ответ 1
insert into YourTable values (...)
получить новый PK с scope_identity()
select scope_identity()
У меня есть первичный ключ, настроенный на автоматическое увеличение.
Я выполняю несколько запросов, и мне нужно получить это значение первичного ключа для использования в качестве внешнего ключа в другой таблице (IsIdentity = TRUE
).
Есть ли элегантный способ вернуть значение первичного ключа, когда я делаю запрос на вставку? Прямо сейчас я требую и получаю наивысшую ценность в этом столбце, который кажется действительно взломанным.
Любые предложения?
insert into YourTable values (...)
получить новый PK с scope_identity()
select scope_identity()
Если вы используете 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" для получения дополнительных возможностей.
INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)
Примечание. Это для MS SQL 2005 и выше
SCOPE_IDENTITY(), вероятно, вы хотите. Он возвращает идентификатор последней записи, вставленной в тот же контекст кода, в котором он выполняется.
IDENT_CURRENT ('tablename') распространяется на проблемы concurrency. То есть, нет гарантии, что другая запись не будет вставлена между INSERT и вызовом IDENT_CURRENT.
Должен признаться, я не уверен в том, что источник изумления, о котором упоминает VillageIdiot, но я сам очень удивлен тем, что этот вопрос не является дубликатом вообще.
Святое дерьмо!!!
просто вызовите функцию SCOPE_IDENTITY()
:
insert into your_talble(col1,col2) values('blah','more blah')
select scope_identity()
потому что выбор самого высокого значения вернет ошибку, если какой-либо другой оператор сделает вставку. функция SCOPE_IDENTITY()
возвращает идентификатор, созданный в текущем контексте (то есть вашим выражением)
Вы должны использовать scope_identity(). И я рекомендую обернуть оператор insert и scope_identity() в транзакцию.