Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Copie en cascade des lignes dans sql

Vous pouvez utiliser la merge avec la clause de sortie pour obtenir une correspondance entre l'ancien et le nouvel identifiant dans questionText. Ceci est décrit dans cette question Utilisation de merge..output pour obtenir le mappage entre source.id et target.id .

Dans votre cas, le code ressemblerait à ceci. Le code n'est pas testé, il peut donc y avoir un certain nombre de fautes de frappe, mais il montre ce que vous pouvez faire.

create procedure CopyQuestion
  @idtocopy int
as

declare @QuestionID int

insert into question
select Name 
from question 
where ID = @idtocopy

select @QuestionID = scope_identity() 

declare @IDs table (NewQID int, OldQID int)

merge questionText as T
using (select ID, @QuestionID as QuestionID, Field
       from questionText
       where QuestionID = @idtocopy) as S
on 0=1
when not matched then
  insert (QuestionID, Field) values (QuestionID, Field)
output inserted.ID, S.ID   into @IDs;       

insert into options
select 
    I.NewQID,
    O.Field
from options O
  inner join @IDs as I
    on O.QuestionTextID = I.OldQID