Microsoft SQL Server
커서
수색…
통사론
- DECLARE cursor_name CURSOR [지역 | 글로벌]
- [FORWARD_ONLY | 스크롤]
[정적 | 키셋 | 다이나믹 | 빨리 감기 ]
[READ_ONLY | SCROLL_LOCKS | 최적 [OPTIMISTIC]
[TYPE_WARNING] - FOR select_statement
- [FOR UPDATE [OF column_name [, ... n]]]
- [FORWARD_ONLY | 스크롤]
비고
일반적으로 성능에 부정적인 영향을 줄 수 있으므로 커서를 사용하지 않는 것이 좋습니다. 그러나 일부 특수한 경우에는 레코드별로 데이터 레코드를 반복하고 일부 작업을 수행해야 할 수도 있습니다.
기본 전달 전용 커서
일반적으로 성능에 부정적인 영향을 줄 수 있으므로 커서를 사용하지 않는 것이 좋습니다. 그러나 일부 특수한 경우에는 레코드별로 데이터 레코드를 반복하고 일부 작업을 수행해야 할 수도 있습니다.
DECLARE @orderId AS INT
-- here we are creating our cursor, as a local cursor and only allowing
-- forward operations
DECLARE rowCursor CURSOR LOCAL FAST_FORWARD FOR
-- this is the query that we want to loop through record by record
SELECT [OrderId]
FROM [dbo].[Orders]
-- first we need to open the cursor
OPEN rowCursor
-- now we will initialize the cursor by pulling the first row of data, in this example the [OrderId] column,
-- and storing the value into a variable called @orderId
FETCH NEXT FROM rowCursor INTO @orderId
-- start our loop and keep going until we have no more records to loop through
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @orderId
-- this is important, as it tells SQL Server to get the next record and store the [OrderId] column value into the @orderId variable
FETCH NEXT FROM rowCursor INTO @orderId
END
-- this will release any memory used by the cursor
CLOSE rowCursor
DEALLOCATE rowCursor
기본 커서 구문
몇 가지 예제 테스트 행에서 작동하는 간단한 커서 구문 :
/* Prepare test data */
DECLARE @test_table TABLE
(
Id INT,
Val VARCHAR(100)
);
INSERT INTO @test_table(Id, Val)
VALUES
(1, 'Foo'),
(2, 'Bar'),
(3, 'Baz');
/* Test data prepared */
/* Iterator variable @myId, for example sake */
DECLARE @myId INT;
/* Cursor to iterate rows and assign values to variables */
DECLARE myCursor CURSOR FOR
SELECT Id
FROM @test_table;
/* Start iterating rows */
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myId;
/* @@FETCH_STATUS global variable will be 1 / true until there are no more rows to fetch */
WHILE @@FETCH_STATUS = 0
BEGIN
/* Write operations to perform in a loop here. Simple SELECT used for example */
SELECT Id, Val
FROM @test_table
WHERE Id = @myId;
/* Set variable(s) to the next value returned from iterator; this is needed otherwise the cursor will loop infinitely. */
FETCH NEXT FROM myCursor INTO @myId;
END
/* After all is done, clean up */
CLOSE myCursor;
DEALLOCATE myCursor;
SSMS 결과. 이들은 모두 별도의 쿼리이므로 아무 것도 통합되지 않습니다. 쿼리 엔진이 각 반복을 하나의 집합이 아닌 하나씩 처리하는 방법에 유의하십시오.
신분증 | 발 |
---|---|
1 | 푸 |
(1 행 영향) |
신분증 | 발 |
---|---|
2 | 바 |
(1 행 영향) |
신분증 | 발 |
---|---|
삼 | 바스 |
(1 행 영향) |
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow