首頁  >  文章  >  php教程  >  SQLSERVER遊標及循環語句

SQLSERVER遊標及循環語句

高洛峰
高洛峰原創
2016-12-14 11:30:461463瀏覽

整理一下,關於遊標,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 是指全域遊標。

cursor_name

要從中進行提取的開啟的遊標的名稱。如果全域遊標和局部遊標都使用 cursor_name 作為它們的名稱,那麼當指定 GLOBAL 時,cursor_name 指的是全域遊標;未指定 GLOBAL 時,cursor_name 指的是局部遊標。

@ cursor_variable_name

遊標變數名,引用要從中進行提取操作的開啟的遊標。

INTO @variable_name[ ,...n]

允許將擷取作業的資料列資料放到局部變數中。清單中的各個變數從左到右與遊標結果集中的對應列相關聯。各變數的資料類型必須與對應的結果集列的資料類型匹配,或是結果集列資料類型所支援的隱式轉換。變數的數目必須與遊標選擇清單中的列數一致。

  註解

如果 SCROLL 選項未在 ISO 樣式的 DECLARE CURSOR 語句中指定,則 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 選項。

DYNAMIC SCROLL 遊標支援除 ABSOLUTE 以外的所有 FETCH 選項。

@@FETCH_STATUS 函數會報告上一個 FETCH 語句的狀態。相同的資訊記錄在由 sp_describe_cursor 傳回的遊標中的 fetch_status 欄位中。這些狀態資訊應該用於在對由 FETCH 語句傳回的資料進行任何操作之前,以確定這些資料的有效性。有關詳細信息,請參閱 @@FETCH_STATUS (Transact-SQL)。

  權限

FETCH 權限預設會授予任何有效的使用者。 

  範例

A. 在簡單的遊標中使用 FETCH

以下範例為 Person.Contact 表中姓氏以 FEB 開頭的行宣告了一個簡單的遊標,並使用這些遊標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