0

我有一个包含存储过程列表的表。

我正在使用游标然后循环并调用和捕获每个存储过程的结果(它们都返回 0 或 1)。

所以我有:

DECLARE @PROC_ID INT,
        @PROC_NAME VARCHAR(50)

SELECT *
INTO #MY_PROCS
FROM TABLE_PROCS

DECLARE MY_CURSOR CURSOR FOR
SELECT PROC_ID, PROC_NAME
FROM TABLE_PROCS

OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @PROC_ID, @PROC_NAME

WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @PROC_RESULT = .......

  UPDATE #MY_PROCS SET PROC_RESULT = @PROC_RESULT WHERE PROC_ID = @PROC_ID
END

CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR

DROP TABLE #MY_PROCS

我在游标上阅读READ ONLYNO LOCK如果可能的话,我应该尽可能地设置它。

另外,我应该使用表变量而不是临时表吗?

是否可以使用 oa 光标来执行此操作?

4

2 回答 2

5

至少在我的所有测试中,最有效的光标将是:

DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR ...

现在,我们不可能知道您是否可以在没有光标的情况下执行此操作。您方便地遗漏了我们可以用来告诉您的唯一信息。似乎您正在为每个调用调用一个过程,但您不能使用 SELECT 来执行此操作。然后你用结果更新一个表,但你删除了这个表。

于 2012-06-13T15:13:30.640 回答
0

因此,您有两个表,其中一个您希望使用另一个表中的值进行更新,并且它们共享一个公共键。干得好:

update [m]
set proc_id = t.proc_id
from #MY_PROCS as [m]
inner join TABLE_PROCS as [t]
   on m.proc_id = t.proc_id
于 2012-06-13T17:34:09.643 回答