문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| sqlserver:cursor [2020/07/31 04:35] – [방법2] taekgu | sqlserver:cursor [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| ====== CURSOR사용하기 ====== | ====== CURSOR사용하기 ====== | ||
| MS SQL Server에서는 For-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 ===== | ===== 방법1 ===== | ||
| WHILE @@FETCH_STATUS = 0를 이용하는 방법으로 표준적인 방법 | WHILE @@FETCH_STATUS = 0를 이용하는 방법으로 표준적인 방법 | ||
| 줄 29: | 줄 37: | ||
| PRINT ' | PRINT ' | ||
| END CATCH | END CATCH | ||
| + | | ||
| FETCH NEXT FROM cursor_product INTO | FETCH NEXT FROM cursor_product INTO | ||
| @product_name, | @product_name, | ||
| 줄 41: | 줄 50: | ||
| ===== 방법2 ===== | ===== 방법2 ===== | ||
| 무한루프를 이용하여 FETCH문을 한번만 기술한다. | 무한루프를 이용하여 FETCH문을 한번만 기술한다. | ||
| - | 한가지 문제점이 있다면 **@@FETCH_STATUS**는 GLOBAL변수라는 것이다. | + | 한가지 문제점이 있다면 **@@FETCH_STATUS**는 |
| <code sql> | <code sql> | ||
| DECLARE cursor_product CURSOR | DECLARE cursor_product CURSOR | ||
| 줄 63: | 줄 72: | ||
| PRINT @product_name + CAST(@list_price AS varchar) | PRINT @product_name + CAST(@list_price AS varchar) | ||
| END | END | ||
| + | |||
| + | CLOSE cursor_product; | ||
| + | |||
| + | DEALLOCATE cursor_product; | ||
| </ | </ | ||
| + | |||
| + | |||