【问题标题】:Best way to replace cursor in SQL Server 2008在 SQL Server 2008 中替换光标的最佳方法
【发布时间】:2013-03-20 18:38:35
【问题描述】:

我想从我的存储过程中替换光标代码

DECLARE CursorXD CURSOR FOR
   SELECT 
       IDOrdre, Quantity,fabnum
   FROM prod_ordreplanificationdetail
   WHERE fab = @num
     AND ordre = @ord

OPEN CursorXD 

FETCH NEXT FROM CursorXD INTO @correctionnumsap, @correctionquantite, @correctionnumfabrication

WHILE @@FETCH_STATUS = 0
BEGIN
   EXEC INSERT#prod @idordre = @correctionnumsap,
                    @quantite = @correctionquantiteneg,
                    @fabnum = @correctionnumfabrication

   FETCH NEXT FROM CursorXD INTO @correctionnumsap, @correctionquantite, @correctionnumfabrication
END

CLOSE CursorXD 
DEALLOCATE CursorXD

替换此光标以提高性能的最佳方法是什么?

有什么建议吗?

【问题讨论】:

  • 您将需要重写游标中调用的存储过程,以对游标迭代的整个数据集进行操作,而不是一次操作一行。其他任何东西仍然是逐行的,这不会比这里使用的游标更有效......
  • 如果您发布存储过程的定义,我们可以提供有关如何完成此操作的建议...
  • 需要exec INSERT#prod的更多描述

标签: sql sql-server-2008 stored-procedures cursor


【解决方案1】:

这是一个选项,但我做了几个假设

INSERT INTO prod
SELECT IDOrdre, Quantity,fabnum
FROM prod_ordreplanificationdetail
WHERE fab=@num
  AND ordre=@ord

假设:

  1. SP INSERT#prod 仅执行 INSERT 并且不执行其他数据操作
  2. SP INSERT#prod 插入到名为 prod 的表中,表中只有三列

【讨论】:

    【解决方案2】:

    您可以通过维护第 n 行值来使用 WHILE 循环而不是 CURSOR。与 CURSOR 相比,它在性能方面太好了。如果你清楚地告诉你你需要什么,那么我们就可以走上同一条路。

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多