我有一个包含存储过程列表的表。
我使用游标然后循环并调用并捕获每个存储过程的结果(它们都返回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 ONLY
和NO LOCK
。
另外,我应该使用表变量而不是临时表吗?
是否可以通过光标执行此操作?
答案 0 :(得分:5)
最有效的游标将是,至少在我的所有测试中:
DECLARE MY_CURSOR CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR ...
现在,我们不可能知道你是否可以在没有光标的情况下做到这一点。您已经方便地省略了我们可以用来告诉您的唯一信息。看来你正在为每个调用调用一个过程,但你不能用SELECT做这个。然后你用结果更新一个表,但你放弃了表。
答案 1 :(得分: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