Eu tenho um procedimento armazenado que tem um parâmetro de saída do CURSOR VARYING
tipo. Gostaria de verificar se o cursor de saída pode ser usado pelo código que chamou o procedimento armazenado. Parecia que CURSOR_STATUS
era a função certa a ser usada, mas estou obtendo resultados inesperados ao aplicá-la ao meu cursor de saída. A função retorna um valor de -3 dentro do procedimento armazenado que o criou, mas funciona conforme o esperado fora do procedimento armazenado. Veja o código abaixo:
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
Estou no SQL Server 2019 CU14 se for importante. Por que CURSOR_STATUS
retorna um valor de -3 ("Um cursor com o nome especificado não existe.") dentro do procedimento armazenado?