TSQL Parent>小孩>没有光标的子子复制
我正在创建一个SQL 2008 R2存储过程来复制行及其所有子行。
这是一个包含父,子和子子的3层设置
给定我需要创建副本的父ID。
我用
fast_forward
ѭ1解决了它。
我知道我也可以通过行循环执行它,但我不相信这会比这个游标方法更快。你的想法是什么?
有没有更好的方法来完成这项任务而不使用游标?
编辑:我考虑的另一个选项是创建一个临时表,其中包含TBLACStages记录的旧/新PKID。
TBLACStages可能有1到20个相应的行(TBLACUpgrade每行TBLACStages行可能有3行)
CREATE PROCEDURE [dbo].[spDuplicateACUnit]
@pACUnitID bigint = 0
AS BEGIN
SET NOCOUNT ON;
DECLARE @NewACUnitID bigint = 0
INSERT INTO TBLACUnits ([col1] ,[col2] ,[...] ,[coln]) SELECT [col1] ,[col2] ,[...] ,[coln] FROM TBLACUnits WHERE ACUnitID = @pACUnitID
SELECT @NewACUnitID = SCOPE_IDENTITY()
DECLARE @ACStageID bigint = 0
DECLARE @NewACStageID bigint = 0
DECLARE @ACUnitCursor CURSOR
SET @ACUnitCursor = CURSOR LOCAL FAST_FORWARD FOR SELECT ACStageID FROM TBLACStages WHERE TBLACStages.ACUnitID = @pACUnitID
OPEN @ACUnitCursor
FETCH NEXT FROM @ACUnitCursor INTO @ACStageID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO TBLACStages ([ACUnitID] ,[col1] ,[col2] ,[...] ,[coln]) SELECT @NewACUnitID ,[col1] ,[col2] ,[...] ,[coln] FROM TBLACStages WHERE TBLACStages.ACStageID = @ACStageID
SELECT @NewACStageID = SCOPE_IDENTITY()
INSERT INTO TBLACUpgrade ([ACStageID] ,[col1] ,[col2] ,[...] ,[coln]) SELECT @NewACStageID ,[col1] ,[col2] ,[...] ,[coln] FROM TBLACUpgrade WHERE TBLACUpgrade.[ACStageID] = @ACStageID
FETCH NEXT FROM @ACUnitCursor INTO @ACStageID
END
CLOSE @ACUnitCursor DEALLOCATE @ACUnitCursor
END
GO
没有找到相关结果
已邀请:
4 个回复
痴浪墨
揽芳僵迷仇
。没有
我应该适当地工作
信藉乒
的新列,然后在新表的子查询中引用该字段,以便快速轻松地查找旧的父数据。简单。但是,如果您无权在表中添加列,则通常可以快速入侵。一个例子是Last Modified User字段,通常是一个100左右的nvarchar字符。通常我们需要更新此字段,因此请将旧控制号放在那里然后离开。只需记住在完成后对“上次修改的用户”字段执行快速更新。这是示例,我使用临时表进行测试,但您应该使用真实表。
慷祈霖黑
所以你的SP将是这样的: