我有一个具有该CURSOR VARYING
类型的输出参数的存储过程。我想验证调用存储过程的代码是否可以使用输出游标。这似乎CURSOR_STATUS
是使用正确的功能,但将它应用到我的输出光标时,我得到了意想不到的结果。该函数在创建它的存储过程中返回值 -3,但在存储过程之外按预期工作。请看下面的代码:
CREATE OR ALTER PROCEDURE dbo.OutputCursorTest
(@Cursor_OUT CURSOR VARYING OUTPUT)
AS
BEGIN
SET NOCOUNT ON;
SET @Cursor_OUT = CURSOR FORWARD_ONLY STATIC FOR
SELECT [high]
from master..spt_values
OPEN @Cursor_OUT;
SELECT CURSOR_STATUS('variable', '@Cursor_OUT'); -- this seems to always return -3
-- possible workaround
/*
DECLARE @Cur_Copy CURSOR;
SET @Cur_Copy = @Cursor_OUT;
SELECT CURSOR_STATUS('variable', '@Cur_Copy');
DEALLOCATE @Cur_Copy;
*/
RETURN;
END;
GO
DECLARE @Cur CURSOR;
EXEC dbo.OutputCursorTest @Cursor_OUT = @Cur OUTPUT;
SELECT CURSOR_STATUS('variable', '@Cur'); -- this returns 1 as expected
如果重要的话,我在 SQL Server 2019 CU14 上。为什么CURSOR_STATUS
在存储过程中返回值-3(“具有指定名称的游标不存在。”)?
@Cursor_OUT
直到在过程结束时复制出光标,才会将光标分配给“变量” 。在此之前,它不是“游标变量”,因此
CURSOR_STATUS
对于sp_describe_cursor
.也就是说,游标的名称是
@Cursor_OUT
并且可以通过sys.dm_exec_cursors看到。您还可以使用非可变语法创建游标:
您还可以分配
@Cursor_OUT
较早的并在OPEN
通话中使用它。它只是一个指向“真实”光标的指针。使用上述语法的一个优点是它允许您指定
LOCAL
orGLOBAL
。这不适用于变量形式;您获得的游标类型由数据库选项决定CURSOR_DEFAULT
。通常情况下,明确可以防止意外。