Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Каскадно копиране на редове в sql

Можете да използвате обединяване израз с изходната клауза, за да получите съвпадение между стария и новия идентификатор във questionText. Това е описано в този въпрос Използване на merge..output за получаване на съпоставяне между source.id и target.id .

Във вашия случай кодът ще изглежда така. Кодът не е тестван, така че може да има произволен брой правописни грешки, но показва какво можете да направите.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обединете много колони в една, като запазите сходството и замените разликите

  2. Как да напиша SQL заявка за определен период от време и дата час с помощта на SQL Server 2008?

  3. Вземете текущата часова зона на сървъра в SQL Server (T-SQL)

  4. Обединете данни в две целеви таблици

  5. Върнете нарастващата стойност на колона за идентичност в SQL Server