搜尋
首頁php教程PHP开发SQLSERVER遊標及循環語句

整理一下,關於遊標,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  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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境