Вот тестовая таблица для этого обсуждения
create table t4721736 ( id int identity primary key, name varchar(10), comm money )
insert t4721736 select 'John', 232.43 -- id=1
insert t4721736 select 'Alex', 353.52 -- id=2
-- check contents
select * from t4721736
-- do all this in a transaction
BEGIN TRAN
-- dummy insert
insert t4721736 select 'dummy', null
-- get what the id should be
declare @resetto bigint
set @resetto = scope_identity()
-- remove dummy record
delete t4721736 where id = @resetto
-- perform the insert(s)
set identity_insert t4721736 on;
insert t4721736(id,name,comm) select 10000000, 'Smith', 334.23;
set identity_insert t4721736 off;
-- reset the identity
set @resetto = @resetto - 1 -- it needs to be 1 prior
DBCC CHECKIDENT(t4721736, RESEED, @resetto)
COMMIT
Предполагая, что вы полностью понимаете (я полагаю, что да), что произойдет сбой, как только диапазон достигнет записей с назначенными идентификаторами. SQL Server не выполняет автоматического пропуска идентификаторов, к которым уже прикреплены записи.
это не будет проблемой, потому что когда я
вставить с помощью identity_insert, значение
идентификатор будет больше, чем 10 миллионов.
так что не будет никаких проблем
сталкиваясь
Чтобы увидеть, как это не сработает, сократите процесс, изменив «10000000» на «10» в приведенном выше коде. Затем выполните следующие действия:
-- inspect contents, shows records 1,2,10
select * from t4721736
-- next, insert 7 more records, bringing the id up to 9
insert t4721736 select 'U3', 0
insert t4721736 select 'U4', 0
insert t4721736 select 'U5', 0
insert t4721736 select 'U6', 0
insert t4721736 select 'U7', 0
insert t4721736 select 'U8', 0
insert t4721736 select 'U9', 0
Наконец, попробуйте следующую вставку ниже
insert t4721736 select 'U10', 0