序列中 INSERT SELECT UPDATE 迭代的替代方案
Alternative to Iteration for INSERT SELECT UPDATE in a sequence
我有一个 table,其中包含大约 17k 行,我需要按顺序 运行 这些语句集
- 使用 MASTERTABLE 数据插入 TABLE1(MASTERTABLE 有 6 列)
- SELECT TABLE1 中新插入行的列 ID(主键)的值
- 使用存储过程更新 TABLE2 中的 ID 值
我试过:
- while 循环:大约需要 3 个小时才能完成执行
- cursor: 执行一夜后取消查询
- 据我所知,我不能使用 JOIN,因为我需要按顺序执行语句
问题不够详细。我想使用这样的一般想法
-- create a output table to hold new id, and key columns to join later
DECLARE @OutputTbl TABLE (ID INT, key_Columns in MASTERTABLE)
INSERT INTO TABLE1
OUTPUT INSERTED.ID, MASTERTABLE.key_columns INTO @OutputTbl
SELECT *
FROM MASTERTABLE
UPDATE T2
SET ID = o.ID
FROM TABLE2 t2
INNER JOIN OutputTbl o
ON t2.key_column = o.key_column
也许您可以考虑在 TABLE1
上使用 TRIGGER
来调用 TABLE2
上的存储过程,然后您可以在 INSERT
上调用 INSERT
17=].. 一个接一个或成块..
DROP TRIGGER TR_UPD_TABLE2
GO
CREATE TRIGGER TR_UPD_TABLE2 ON TABLE1 AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
DECLARE @columnID INT = NULL
IF (SELECT COUNT(*) FROM INSERTED)=1 BEGIN
-- SINGLE INSERT
SET @columnID = (SELECT columnID FROM INSERTED)
EXEC TableTwoUpdateProcedure @columnID
END ELSE BEGIN
-- MASSIVE INSERT (IF NEEDED)
SET @columnID = 0
WHILE @columnID IS NOT NULL BEGIN
SET @columnID = (SELECT MIN(columnID) FROM INSERTED WHERE columnID > @columnID)
IF @columnID IS NOT NULL BEGIN
EXEC TableTwoUpdateProcedure @columnID
END
END
END
END
我有一个 table,其中包含大约 17k 行,我需要按顺序 运行 这些语句集
- 使用 MASTERTABLE 数据插入 TABLE1(MASTERTABLE 有 6 列)
- SELECT TABLE1 中新插入行的列 ID(主键)的值
- 使用存储过程更新 TABLE2 中的 ID 值
我试过:
- while 循环:大约需要 3 个小时才能完成执行
- cursor: 执行一夜后取消查询
- 据我所知,我不能使用 JOIN,因为我需要按顺序执行语句
问题不够详细。我想使用这样的一般想法
-- create a output table to hold new id, and key columns to join later
DECLARE @OutputTbl TABLE (ID INT, key_Columns in MASTERTABLE)
INSERT INTO TABLE1
OUTPUT INSERTED.ID, MASTERTABLE.key_columns INTO @OutputTbl
SELECT *
FROM MASTERTABLE
UPDATE T2
SET ID = o.ID
FROM TABLE2 t2
INNER JOIN OutputTbl o
ON t2.key_column = o.key_column
也许您可以考虑在 TABLE1
上使用 TRIGGER
来调用 TABLE2
上的存储过程,然后您可以在 INSERT
上调用 INSERT
17=].. 一个接一个或成块..
DROP TRIGGER TR_UPD_TABLE2
GO
CREATE TRIGGER TR_UPD_TABLE2 ON TABLE1 AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
DECLARE @columnID INT = NULL
IF (SELECT COUNT(*) FROM INSERTED)=1 BEGIN
-- SINGLE INSERT
SET @columnID = (SELECT columnID FROM INSERTED)
EXEC TableTwoUpdateProcedure @columnID
END ELSE BEGIN
-- MASSIVE INSERT (IF NEEDED)
SET @columnID = 0
WHILE @columnID IS NOT NULL BEGIN
SET @columnID = (SELECT MIN(columnID) FROM INSERTED WHERE columnID > @columnID)
IF @columnID IS NOT NULL BEGIN
EXEC TableTwoUpdateProcedure @columnID
END
END
END
END