【发布时间】:2018-02-20 21:47:27
【问题描述】:
我有以下代码将未处理的 (processed=0) 记录从服务器 1 插入到服务器 2(使用链接服务器),一旦插入,它应该更新为 processed=1
我只是在使用
查询 1:
INSERT INTO SELECT FROM WHERE processed=0
UPDATE processed=1 WHERE processed=0
查询 2:
DECLARE pending_records CURSOR LOCAL FOR
SELECT FROM WHERE processed=0
OPEN pending_records
FETCH NEXT FROM pending_records INTO @UniqueID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO SELECT FROM WHERE UniqueID=@UniqueID
IF @@ROWCOUNT=1 .... UPDATE processed=1 WHERE UniqueID=@UniqueID
FETCH NEXT FROM pending_records INTO @UniqueID
END
CLOSE pending_records
DEALLOCATE pending_records
查询 1 超级快,使用游标查询太慢(更新 1 条记录需要 30 秒)
我远离查询 1,因为如果数据库中有任何故障,它将影响记录。注意:我现在不能使用DISTRIBUTED TRANSACTION,因为它需要额外的设置。
【问题讨论】:
-
INSERT INTO SELECT FROM WHERE... 如果您担心我们仍会向您发送表名,可以自行编造。你至少可以做一个可以编译的示例。 -
@ZoharPeled 我可以。我现在只注意到一件事,没有
IF @@ROWCOUNT=1 .... UPDATE processed=1 WHERE UniqueID=@UniqueID,完成 400 条记录只需 3 秒。使用更新命令,大约需要 15 分钟(400 条记录) -
所以请edit您的问题,以便我们可以看到有意义的代码。此外,如果我们知道什么表在什么服务器上可能会有所帮助。
-
@ZoharPeled 或者我可以使用
WHILE (count(*) from table > 0), Update top 1.... -
为什么要使用游标来进行这些更新?您不想在这里使用光标,因为您发现性能很糟糕。如果您只想捕获那些已处理的内容,您应该在插入语句中使用输出子句到临时表,然后在插入语句中使用该临时表。
标签: sql sql-server sql-server-2005 cursor linked-server