본문 바로가기
프로그래밍/TSQL

[TSQL]mssql cursor 재사용 방법

by 정리 습관(★arranging★) 2023. 6. 20.
728x90
/

 


mssql에서 조건에 맞는 데이터를 조회하는 커서를 생성하고 해당 커서를 재사용하는 방법은 없습니다.
단, 루프내에 커서를 정의, 해제 하여 동일 기능을 구현 할 수 있습니다.
아래 예시는 TEST_TBL 이라는 테이블에 목적 데이터의 조건을 변경하여 순회하는 예시 입니다.

mssql 커서에는 변수 파라메터를 입력으로 쓸 수 는 없지만 변수를 지정하고 해당 변수에 값 할당을 변경 후 커서를 재 정의하는 방식으로 구현 가능합니다.

최초 시도는 open후 close 하고 변수 값을 변경한 후 다시 open 했을때 변경된 조건에 맞는 레코드를 반환 하기를 바랬지만 예상대로 동작하지 않았고 아래와 같이 구현하는 것이 유일한 방법입니다.



IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'TEST_TBL' and TYPE = 'U')

        DROP TABLE TEST_TBL

CREATE TABLE TEST_TBL (ID INT)

insert TEST_TBL values (1)

insert TEST_TBL values (2)



DECLARE @ID INT

DECLARE @REC_ID INT

SET @ID = 1



DECLARE TEST CURSOR LOCAL FOR

SELECT DISTINCT id FROM TEST_TBL WHERE ID = @ID

OPEN TEST;

FETCH NEXT FROM TEST INTO @REC_ID



WHILE @@FETCH_STATUS = 0

BEGIN

        SELECT @REC_ID

        FETCH NEXT FROM TEST INTO @REC_ID

END

CLOSE TEST;

DEALLOCATE TEST;



SET @ID = 2

DECLARE TEST CURSOR LOCAL FOR

SELECT DISTINCT ID FROM TEST_TBL WHERE id = @ID

OPEN TEST;

FETCH NEXT FROM TEST INTO @REC_ID

WHILE @@FETCH_STATUS = 0

BEGIN

        SELECT @REC_ID

        FETCH NEXT FROM TEST INTO @REC_ID

END

CLOSE TEST;

DEALLOCATE TEST;



IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'TEST_TBL' and type = 'u')

        DROP TABLE TEST_TBL

There is no way in mssql to create a cursor that looks up data that meets a condition and reuse that cursor.
However, the same function can be implemented by defining and canceling the cursor in the loop.
The example below is an example of traversing by changing the condition of the target data in the table called TEST_TBL.

Although variable parameters cannot be written as input to mssql cursors, it can be implemented by assigning a variable, changing the value assignment to that variable, and redefining the cursor.

The first attempt was to open, then close, change the variable value, and then open again, hoping to return a record that meets the changed condition, but it did not work as expected, and the only way to implement it is as follows.

댓글