====== CURSOR사용하기 ======
MS SQL Server에서는 For-Cursor문이 지원되지 않는다.(무식하게도..)
=== @@FETCH_STATUS ===
이 함수는 __**현재 연결**__에서 연 __모든 커서__에 실행된 마지막 커서 FETCH 문의 상태를 반환합니다.
@@FETCH_STATUS는 연결의 모든 커서에 전역으로 적용되므로 신중히 사용하세요.
- FETCH 문이 실행된 후 다른 커서에 대해 다른 FETCH 문을 실행하기 전에 @@FETCH_STATUS의 테스트를 수행해야 합니다.
- @@FETCH_STATUS는 연결에서 페치가 수행되기 전에 정의되지 않습니다.
- 예를 들어 사용자는 한 커서에서 FETCH 문을 실행한 후 다른 커서에서 결과를 열고 처리하는 저장 프로시저를 호출합니다. 호출된 저장 프로시저에서 컨트롤이 반환되면 @@FETCH_STATUS는 저장 프로시저 내에서 실행된 마지막 FETCH를 반영하고 저장 프로시저가 호출되기 전에 실행된 FETCH 문은 반영하지 않습니다.
- 특정 커서의 마지막 페치 상태를 검색하려면 sys.dm_exec_cursors 동적 관리 함수의 fetch_status 열을 쿼리하세요.
===== 방법1 =====
WHILE @@FETCH_STATUS = 0를 이용하는 방법으로 표준적인 방법
DECLARE
@product_name VARCHAR(MAX),
@list_price DECIMAL;
DECLARE cursor_product CURSOR
FOR SELECT
product_name,
list_price
FROM
production.products;
OPEN cursor_product;
FETCH NEXT FROM cursor_product INTO
@product_name,
@list_price;
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
PRINT @product_name + CAST(@list_price AS varchar);
END TRY
BEGIN CATCH
PRINT 'ERROR' + ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM cursor_product INTO
@product_name,
@list_price;
END;
CLOSE cursor_product;
DEALLOCATE cursor_product;
===== 방법2 =====
무한루프를 이용하여 FETCH문을 한번만 기술한다.
한가지 문제점이 있다면 **@@FETCH_STATUS**는 연결에서 GLOBAL변수라는 것이다.
DECLARE cursor_product CURSOR
FOR SELECT
product_name,
list_price
FROM
production.products
OPEN cursor_product
WHILE 1 = 1
BEGIN
FETCH NEXT FROM cursor_product
INTO @product_name,
@list_price
IF @@FETCH_STATUS <> 0 BREAK
-- 작업을 기술
PRINT @product_name + CAST(@list_price AS varchar)
END
CLOSE cursor_product;
DEALLOCATE cursor_product;