Возможно, об этом уже спрашивали, но действительно сложно найти термины, ограничивающие результаты поиска ...
Возьмите следующий фрагмент SQL:
declare @source table (id int)
declare @target table(id int primary key, sourceId int)
set nocount on
insert into @target values (0,0)
insert into @source(id) values(1)
--insert into @source(id) values(2)
set nocount off
insert into @target select (select max(id)+1 from @target), s.id from @source s
select * from @target
Это, очевидно, выполняется без ошибок, но теперь раскомментируйте вторую строку вставки и возникает следующая ошибка:
Msg 2627, Level 14, State 1, Line 15
Violation of PRIMARY KEY constraint 'PK__#7DB3CB72__7EA7EFAB'. Cannot insert duplicate key in object 'dbo.@target'.
Я понимаю, что оператор вставки более чем вероятен в отношении снимка таблицы @target, поэтому (select max(id)+1 from @target)
всегда будет возвращать значение 1, вызывая ошибку нарушения выше ...
Есть ли способ обойти это, кроме обращения к курсору?