这很容易实现,但你需要随时跟踪所有内容。通常我会创建一个单独的存储过程来实现这个功能,该存储过程将复制的问卷作为输入参数。
DECLARE @newQuestionnaireId INT
INSERT INTO Questionnaire
(Id,Description)
SELECT Id, Description
FROM Questionnaire
WHERE ID = @sourceQuestionnaireID
SET @newquestionnaireId = SCOPE_IDENTITY()
现在您有一个新的标题记录以及复制生成的新Id。下一步是将类别加载到临时表中,该表具有新Id的额外字段。
DECLARE @tempCategories TABLE (id INT, description VARCHAR(50),newId INT)
INSERT INTO @tempCategories(id,description)
SELECT id, description FROM Category
WHERE questionnaireId = @sourceQuestionnaireId
现在,您有一个包含所有要插入的类别及其对应新ID字段的临时表。使用游标遍历该列表并插入新记录,并使用类似的SCOPE_IDENTITY调用来填充新的ID。
DECLARE cuCategory CURSOR FOR SELECT Id, Description FROM @tempCategories
DECLARE @catId INT, @catDescription, @newCatId INT
OPEN cuCategory
FETCH NEXT FROM cuCategory INTO @catId,@catDescription
WHILE @@FETCH_STATUS<>0
BEGIN
INSERT INTO Category(description,questionnaireId)
VALUES(@catDescription,@newQuestionnaireId)
SET @newCatId = SCOPE_IDENTITY()
UPDATE @tempCategories SET newCatId=@newCatId
WHERE id=@catId
FETCH NEXT FROM cuCategory INTO @catId,@catDescription
END
CLOSE cuCategory
DEALLOCATE cuCategory
此时,您现在拥有一个临时表,该表将原始问卷中的catId映射到新问卷的catId。这可以用于以类似的方式填充最终表格 - 我会把它留给您作为练习,但如果您遇到困难,请随时在此处回复。
最后,我建议在事务内执行整个操作,以免在出现问题时出现未完成的副本。
一些免责声明:以上所有内容都是快速输入的,不要指望它能立即运行。其次,我假设您所有的PK都是标识字段,它们应该是!如果它们不是,请使用适当的逻辑替换SCOPE_IDENTITY()调用以生成下一个ID。
编辑:
可以在此处找到有关游标操作的文档。
SET IDENTITY_INSERT [table A] ON
插入,B和C同理。 - Jamiec