>php教程 >PHP开发 >SQLSERVER 커서 및 루프 문

SQLSERVER 커서 및 루프 문

高洛峰
高洛峰원래의
2016-12-14 11:30:461489검색

이를 정렬하기 위해 MSDN에서는 커서와 관련하여 다음을 수행합니다.

Transact-SQL 서버 커서를 통해 특정 행을 검색합니다.

매개변수

NEXT

현재 행 바로 다음의 결과 행을 반환하고, 현재 행은 반환된 행으로 증가됩니다. FETCH NEXT가 커서에 대한 첫 번째 인출 작업인 경우 결과 집합의 첫 번째 행이 반환됩니다. NEXT는 기본 커서 추출 옵션입니다.

PRIOR

현재 행 바로 앞의 결과 행을 반환하고, 현재 행은 반환된 행으로 감소됩니다. FETCH PRIOR가 커서에 대한 첫 번째 페치 작업인 경우 행이 반환되지 않으며 커서는 첫 번째 행 앞에 배치됩니다.

FIRST

커서의 첫 번째 행을 반환하고 이를 현재 행으로 만듭니다.

LAST

커서의 마지막 행을 반환하여 현재 행으로 만듭니다.

ABSOLUTE { n | @nvar}

n 또는 @nvar이 양수인 경우 커서 헤드에서 뒤로 n번째 행을 반환하고 반환된 행을 새로운 현재 행으로 변경합니다. n 또는 @nvar이 음수인 경우 커서 끝에서 앞으로 n번째 행을 반환하고 반환된 행을 새로운 현재 행으로 바꿉니다. n 또는 @nvar이 0이면 행이 반환되지 않습니다. n은 정수 상수여야 하며 @nvar의 데이터 유형은 smallint,tinyint 또는 int여야 합니다.

RELATIVE { n | @nvar}

n 또는 @nvar이 양수이면 현재 행에서 뒤로 n번째 행을 반환하고 반환된 행을 새로운 현재 행으로 변경합니다. n 또는 @nvar이 음수인 경우 현재 행에서 앞으로 n번째 행을 반환하고 반환된 행을 새로운 현재 행으로 바꿉니다. n 또는 @nvar이 0이면 현재 행이 반환됩니다. 커서를 처음 가져올 때 n 또는 @nvar을 음수 또는 0으로 설정하고 FETCH RELATIVE를 지정하면 행이 반환되지 않습니다. n은 정수 상수여야 하며 @nvar의 데이터 유형은 smallint,tinyint 또는 int여야 합니다.

GLOBAL

지정된 커서_이름은 전역 커서를 나타냅니다.

cursor_name

추출할 열린 커서의 이름입니다. 전역 및 로컬 커서가 모두 커서_이름을 이름으로 사용하는 경우 GLOBAL이 지정되면 커서_이름은 전역 커서를 참조하고 GLOBAL이 지정되지 않으면 커서_이름은 로컬 커서를 참조합니다.

@cursor_variable_name

추출할 열린 커서를 참조하는 커서 변수 이름입니다.

INTO @variable_name[ ,...n]

추출 작업의 열 데이터를 로컬 변수에 배치할 수 있습니다. 목록의 각 변수는 커서 결과 집합의 해당 열과 왼쪽에서 오른쪽으로 연결됩니다. 각 변수의 데이터 유형은 해당 결과 세트 열의 데이터 유형과 일치하거나 결과 세트 열 데이터 유형에서 지원하는 암시적 변환이어야 합니다. 변수 수는 커서 선택 목록의 열 수와 일치해야 합니다.

주석

ISO 스타일 DECLARE CURSOR 문에 SCROLL 옵션이 지정되지 않은 경우 NEXT가 유일하게 지원되는 FETCH 옵션입니다. ISO 스타일 DECLARE CURSOR 문에 SCROLL 옵션이 지정된 경우 모든 FETCH 옵션이 지원됩니다.

Transact-SQL DECLARE 커서 확장을 사용하는 경우 다음 규칙이 적용됩니다.

FORWARD_ONLY 또는 FAST_FORWARD가 지정된 경우 NEXT는 유일하게 지원되는 FETCH 옵션입니다.

DYNAMIC, FORWARD_ONLY 또는 FAST_FORWARD 옵션이 지정되지 않고 KEYSET, STATIC 또는 SCROLL 중 하나가 지정된 경우 모든 FETCH 옵션이 지원됩니다.

동적 스크롤 커서는 ABSOLUTE를 제외한 모든 FETCH 옵션을 지원합니다.

@@FETCH_STATUS 함수는 이전 FETCH 문의 상태를 보고합니다. sp_describe_cursor에서 반환된 커서의 fetch_status 열에도 동일한 정보가 기록됩니다. 이 상태 정보는 데이터에 대한 작업을 수행하기 전에 FETCH 문에서 반환된 데이터의 유효성을 확인하는 데 사용되어야 합니다. 자세한 내용은 @@FETCH_STATUS(Transact-SQL)를 참조하세요.

권한

FETCH 권한은 기본적으로 모든 유효한 사용자에게 부여됩니다.

A. 단순 커서에서 FETCH 사용

다음 예에서는 Person에서 성이 문자 B로 시작하는 행을 선언합니다. 연락처 테이블 간단한 커서를 만들고 FETCH NEXT를 사용하여 행을 하나씩 가져옵니다. FETCH 문은 DECLARE CURSOR에 지정된 열의 값을 단일 행 결과 집합으로 반환합니다.

USE AdventureWorks
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName

OPEN contact_cursor

-- Perform the first fetch.
FETCH NEXT FROM contact_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

B. FETCH를 사용하여 변수에 값 저장

다음 예는 예 A와 유사하지만 FETCH 문의 출력이 대신 로컬 변수에 저장됩니다. 클라이언트에게 직접 반환됩니다. PRINT 문은 변수를 단일 문자열로 결합하여 클라이언트에 반환합니다.

USE AdventureWorks
GO
-- Declare the variables to store the values returned by FETCH.
DECLARE @LastName varchar(50), @FirstName varchar(50)

DECLARE contact_cursor CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement. 

FETCH NEXT FROM contact_cursor
INTO @LastName, @FirstName

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

   -- Concatenate and display the current values in the variables.
   PRINT 'Contact Name: ' + @FirstName + ' ' +  @LastName

   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
   INTO @LastName, @FirstName
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

C. SCROLL 커서 선언 및 기타 FETCH 옵션 사용

以下示例创建一个 SCROLL 游标,使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持全部滚动功能。

另外,再举一个简单的例子:

Declare @Id varchar(20) 
Declare @Name varchar(20) 
Declare Cur Cursor For 
select substring(id,0,7) as id,name from temp1 
Open Cur 
Fetch next From Cur Into @Id,@Name 
While @@fetch_status=0 
Begin 
Update temp Set [c3]=@Name where [id] like @Id+'%' 
Fetch Next From Cur Into @Id,@Name 
End 
Close Cur 
Deallocate Cur 

 

简单的FOR循环等:

declare   @i   int   
  set   @i=0   
  while   @i<10   
  begin   
      set   @i   =   @i+1   
  end   
    
  SQL   SERVER不支持FOR循环

USE AdventureWorks
GO
-- Execute the SELECT statement alone to show the 
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Fetch the last row in the cursor.
FETCH LAST FROM contact_cursor

-- Fetch the row immediately prior to the current row in the cursor.
FETCH PRIOR FROM contact_cursor

-- Fetch the second row in the cursor.
FETCH ABSOLUTE 2 FROM contact_cursor

-- Fetch the row that is three rows after the current row.
FETCH RELATIVE 3 FROM contact_cursor

-- Fetch the row that is two rows prior to the current row.
FETCH RELATIVE -2 FROM contact_cursor

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

语法

FETCH 
          [ [ NEXT | PRIOR | FIRST | LAST 
                    | ABSOLUTE { n | @nvar } 
                    | RELATIVE { n | @nvar } 
               ] 
               FROM 
          ] 
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name } 
[ INTO @variable_name [ ,...n ] ]


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:SQL 커서 간단한 예다음 기사:SQL 커서 간단한 예