J'ai essayé d'effectuer ce qui suit afin de mettre à jour une valeur d'identité de pseudo en même temps que l'utilisation de la valeur pour créer de nouvelles lignes, mais APPLY n'aime pas les instructions UPDATE comme source de la table de droite. Quelle est l'alternative la plus élégante en dehors de la simple utilisation d'une colonne d'identité?Utilisez APPLY avec une instruction UPDATE comme source de ligne
create table Temp1(
id int not null identity(1,1) primary key
,data nvarchar(max) null)
create table Temp2(
id int not null primary key
,fkTemp1 int not null references Temp1(id)
,data nvarchar(max) null)
create table Numbering(
ObjectCode int not null primary key
,AutoKey int)
insert into Temp1(data) values('test string')
insert into Temp1(data) values('another test string')
insert into Numbering(ObjectCode, AutoKey) values(4, 1)
insert into Temp2(id, fkTemp1, data)
select n.AutoKey, t1.id, t1.data
from Temp1 t1
left join Temp2 t2 on t2.fkTemp1 = t1.id
cross apply (update Numbering set AutoKey = AutoKey + 1 output inserted.AutoKey where ObjectCode = 4) n
where t2.id is null -- only insert where a target row does not already exist
Même en admettant APPLIQUER, votre demande de ne pas me donner un sens. Vous avez "où t2.id est nul" sur votre insert..select, mais la colonne id de Temp2 ne peut jamais être nulle (par définition), donc vous ne devriez jamais avoir de résultats à insérer. – RBarryYoung