Sql server 我需要一个光标,如何在没有锁的情况下有效地执行此操作

Sql server 我需要一个光标,如何在没有锁的情况下有效地执行此操作,sql-server,cursor,Sql Server,Cursor,我有一个包含存储过程列表的表 我使用一个游标循环,调用并捕获每个存储过程的结果,它们都返回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

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

我使用一个游标循环,调用并捕获每个存储过程的结果,它们都返回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
我在读游标,如果可能的话,我应该将它设置为只读和无锁

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


是否可以在没有光标的情况下执行此操作?

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

DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR ...

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

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

DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR ...

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

因此有两个表,其中一个表要用另一个表的值更新,它们共享一个公共键。给你:

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

因此,您有两个表,其中一个表要使用另一个表中的值进行更新,并且它们共享一个公共键。给你:

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

有可能做什么?您在SELECT@PROC_RESULT-我不知道正确的语法……在没有光标的情况下总是可以工作的……而且99.9%的时间是首选的……避免使用光标没有锁是不可能的——即使使用NOLOCK,也会使用一些锁,并且锁是SQL Server操作的一个组成部分——您不能只打开这些锁off@Romil你能解释一下身份栏是怎么写的吗在临时桌上,你能帮忙吗?我不认为这个问题与无法循环有关。@JustinPihony好的,但是游标就像编程世界中的许多其他东西一样,就像生活一般。如果你正确使用它们,你就不必追踪任何东西,而且游标并不是SQL Server中唯一可以滥用的东西。就个人而言,我从来没有追踪过实际上由游标引起的内存泄漏,但我可以想象,它们的使用方式肯定会导致这种情况。我知道高速公路上每天都会发生车祸,但有时这是到达某处的最佳途径。有可能做什么?您在SELECT@PROC_RESULT-我不知道正确的语法……在没有光标的情况下总是可以工作的……而且99.9%的时间是首选的……避免使用光标没有锁是不可能的——即使使用NOLOCK,也会使用一些锁,并且锁是SQL Server操作的一个组成部分——您不能只打开这些锁off@Romil你能解释一下身份栏是怎么写的吗在临时桌上,你能帮忙吗?我不认为这个问题与无法循环有关。@JustinPihony好的,但是游标就像编程世界中的许多其他东西一样,就像生活一般。如果你正确使用它们,你就不必追踪任何东西,而且游标并不是SQL Server中唯一可以滥用的东西。就个人而言,我从来没有追踪过实际上由游标引起的内存泄漏,但我可以想象,它们的使用方式肯定会导致这种情况。我知道高速公路上每天都会发生车祸,但有时候这是最好的办法。