Sql server 游标使用runnable select获取堆栈

Sql server 游标使用runnable select获取堆栈,sql-server,tsql,cursor,Sql Server,Tsql,Cursor,有人能解释一下为什么它会卡在我的箱子里吗?我找不到原因,因为独立选择本身正在完成。您需要在循环中实际执行步骤,您可以通过在循环中重复获取来执行此操作: DECLARE @a uniqueidentifier, @b uniqueidentifier, @c datetime, @d numeric(15, 2) DECLARE MyCursor CURSOR FOR SELECT Z.ID, Z.Name, Z.Date, (V1.Credit - V2.Debet) AS Money FRO

有人能解释一下为什么它会卡在我的箱子里吗?我找不到原因,因为独立选择本身正在完成。

您需要在循环中实际执行步骤,您可以通过在循环中重复获取来执行此操作:

DECLARE @a uniqueidentifier, @b uniqueidentifier, @c datetime, @d numeric(15, 2) 
DECLARE MyCursor CURSOR FOR
SELECT Z.ID, Z.Name, Z.Date, (V1.Credit - V2.Debet) AS Money
FROM dbo.Table1 V1
INNER JOIN dbo.Table1 V2
ON V2.Name = V1.Name AND V2.ID = V1.ID AND V2.Date = V1.Date
INNER JOIN dbo.Table2 Z
ON Z.Name = V1.Name AND Z.ID = V1.ID AND Z.Date = V1.Date
WHERE V1.Date = DATEADD(Day, Z.AllowedDays, V2.Date)  
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @a, @b, @c, @d
    -- Get stuck here!!!
print 'My Cursor goes ahead'
WHILE @@FETCH_STATUS = 0
BEGIN
...
否则,它是一个无限循环,不断地处理第一行

另一方面,光标很少是正确的答案;也许你应该考虑尝试一个基于集合的解决方案,而不是光标。如果确实需要光标,至少要执行以下操作:

FETCH NEXT FROM MyCursor INTO @a

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Some operations

    FETCH NEXT FROM MyCursor INTO @a
----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
END
如果查询正在旋转,那么它可能正在被阻止。这可能是由于光标选项,因此尝试
LOCAL FAST\u FORWARD
可能会有所帮助,但可能不止这些。我们无法猜测您被什么阻止,但您可以自己检查。停止查询,然后在该窗口中执行
SELECT@@SPID
并记下返回的数字。现在,再次启动游标查询,并打开一个新窗口。运行以下命令(将
x
替换为
@@SPID
编号):

现在,如果您在第一列中获得另一个会话id,您可以使用类似的查询和
DBCC
命令查看它们在做什么以及为什么要阻止您:

SELECT blocking_session_id, wait_type FROM sys.dm_exec_requests 
  WHERE session_id = x;

(同样,用上一次查询中的会话id替换
y

您确定@和所选字段的数据类型匹配吗?显示所有代码,问题可能就在那里。你能更好地定义“卡住”吗?它是在运行还是在运行,或者查询只是成功返回而没有做更多的事情?还有,您是如何读取这些代码的?空白是一件美好的事情。我想是的,它看起来不像这样。我怎样才能确定呢?@aaron bertrand,它不会返回
print“我的光标向前移动”
我知道,它无论如何也不会运行循环(只需通过打印进行检查)。请查看它被卡住的地方。@user1464922您的查询中可能有错误。我们说不出来,因为你把它评论掉了。
SELECT blocking_session_id, wait_type FROM sys.dm_exec_requests 
  WHERE session_id = x;
SELECT status, command FROM sys.dm_exec_requests
  WHERE session_id = y;

DBCC INPUTBUFFER(y);