Я создаю хранимую процедуру SQL 2008 R2 для дублирования строки и всех ее дочерних элементов.TSQL Parent> Child> Дублирование суб-ребенка без курсора
Это трехуровневая настройка с родителем, дочерним элементом и дочерним элементом Учитывая идентификатор родителя, мне нужно создать дубликат.
Я решил это, используя fast_forward
cursor
.
Я знаю, что я также могу сделать это с циклом while через строки, но я не верю, что это будет быстрее, чем этот метод курсора. Что ты думаешь?
Есть ли лучший способ выполнить эту задачу без использования курсоров?
EDIT: Еще один вариант, который я рассматривал, заключался в создании временной таблицы, содержащей старые/новые PKID из записей TBLACStages.
TBLACStages может быть от 1 до 20 соответствующих строк (и TBLACUpgrade вероятно, будет иметь 3 строк на TBLACStages подряд)
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
Извините, что форматирование выглядит плохо, копирование/вставка в SO не так-то просто. – Matthew
У вас есть ключи-кандидаты (уникальный столбец) в TBLACStages, кроме ACStageID? –
Нет, единственный гарантированный уникальный столбец - это ПК, который является ACStageID – Matthew