codememo

커서가 존재하는지 확인하는 방법(열림 상태

tipmemo 2023. 8. 1. 20:34
반응형

커서가 존재하는지 확인하는 방법(열림 상태

커서가 열려 있는지 확인하려면 어떻게 해야 합니까?왜냐하면 'Cursor is already exists'라는 오류가 자주 발생하기 때문입니다.커서가 이미 열린 상태인지 어떻게 확인할 수 있는지 알려주세요.

실제로 마지막에 할당 해제뿐만 아니라 종료했습니다(CLOSE ppm_cursor; DELOCALATE ppm_cursor;). 하지만 여전히 동일한 오류가 발생하고 있습니다.

CURSOR_STATUS 함수를 사용하여 상태를 확인할 수 있습니다.

IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
 DEALLOCATE myCursor
END

커서를 닫고 비어 있으면 할당 취소:

IF CURSOR_STATUS('global','myCursor') >= -1
 BEGIN
  IF CURSOR_STATUS('global','myCursor') > -1
   BEGIN
    CLOSE myCursor
   END
 DEALLOCATE myCursor
END

Gary W가 'SELECT'를 추가하여 언급한 내용에 약간의 변경만 추가:

IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
 DEALLOCATE myCursor
END

http://social.msdn.microsoft.com/Forums/en/sqlgetstarted/thread/eb268010-75fd-4c04-9fe8-0bc33ccf9357

이전 답변을 확장하면 커서가 열려 있거나 할당된 것이 걱정되는 경우 이 프로세스를 호출하는 데 유용합니다.

CREATE OR ALTER PROCEDURE dbo.CloseAndDeallocateCursor
    @cursorName NVARCHAR(80)
AS
BEGIN
    IF CURSOR_STATUS('global', @cursorName) >= -1
    BEGIN
        DECLARE @SQL NVARCHAR(91)
        IF CURSOR_STATUS('global', @cursorName) > -1
        BEGIN
            SET @SQL = N'CLOSE ' + @cursorName
            EXEC sp_executeSQL @SQL
        END
        SET @SQL = N'DEALLOCATE ' + @cursorName
        EXEC sp_executeSQL @SQL
    END
END
GO

그리고 샘플 사용...

EXEC dbo.CloseAndDeallocateCursor 'myCursor'
DECLARE myCursor STATIC 
        FOR SELECT * FROM blah

저는 커서를 거의 사용하지 않지만, 여기서 여러분을 물어뜯을 수 있는 다른 항목을 발견했습니다. 커서 이름의 범위입니다.

CURSOR_DEFAULT 데이터베이스가 전역인 경우 특정 이름(예: "cur")으로 저장 프로시저에서 커서를 선언하면 "cursor already exists" 오류가 발생하며, 해당 커서가 열려 있는 동안 동일한 이름(예: "cur")으로 커서를 선언하고 여는 다른 저장 프로시저를 호출합니다.이 오류는 "cur"를 열려고 할 때 중첩된 저장 프로시저에서 발생합니다.

다음 SQL 비트를 실행하여 CURSOR_DEFAULT를 확인합니다.

select is_local_cursor_default from sys.databases where name = '[your database name]'

이 값이 "0"이면 중첩된 커서의 이름을 지정하는 방법이 중요합니다!

이 문제는 커서를 레코드 위에 놓고 닫기 전에 반복하기 위해 사용하는 동안 SSMS에서 실행 중인 저장 프로시저에서 오류가 발생했을 때 발생했습니다.이 문제를 해결하기 위해 CATCH 블록에 추가 코드를 추가하여 커서가 아직 열려 있으면 닫습니다(여기의 다른 답변에서 제시한 대로 CURSOR_STATUS 사용).

언급URL : https://stackoverflow.com/questions/7430560/how-to-check-if-cursor-exists-open-status

반응형