天天看點

sqlserver遊标使用

整理一下,關于遊标,MSDN有:

過 Transact-SQL 伺服器遊标檢索特定行。

<a href="http://msdn.microsoft.com/zh-cn/library/ms177563.aspx">Transact-SQL 文法約定</a>

sqlserver遊标使用

  參數

<a></a>

<dl></dl>

<dt>NEXT</dt>

<dd></dd>

緊跟目前行傳回結果行,并且目前行遞增為傳回行。如果 FETCH NEXT 為對遊标的第一次提取操作,則傳回結果集中的第一行。NEXT 為預設的遊标提取選項。

<dt>PRIOR</dt>

傳回緊鄰目前行前面的結果行,并且目前行遞減為傳回行。如果 FETCH PRIOR 為對遊标的第一次提取操作,則沒有行傳回并且遊标置于第一行之前。

<dt>FIRST</dt>

傳回遊标中的第一行并将其作為目前行。

<dt>LAST</dt>

傳回遊标中的最後一行并将其作為目前行。

<dt>ABSOLUTE { n | @nvar}</dt>

如果 n 或 @nvar 為正,則傳回從遊标頭開始向後的第 n 行,并将傳回行變成新的目前行。如果 n 或@nvar 為負,則傳回從遊标末尾開始向前的第 n 行,并将傳回行變成新的目前行。如果 n 或 @nvar 為 0,則不傳回行。n 必須是整數常量,并且 @nvar 的資料類型必須為 smallint、tinyint 或 int。

<dt>RELATIVE { n | @nvar}</dt>

如果 n 或 @nvar 為正,則傳回從目前行開始向後的第 n 行,并将傳回行變成新的目前行。如果 n 或@nvar 為負,則傳回從目前行開始向前的第 n 行,并将傳回行變成新的目前行。如果 n 或 @nvar 為 0,則傳回目前行。在對遊标進行第一次提取時,如果在将 n 或 @nvar 設定為負數或

0 的情況下指定 FETCH RELATIVE,則不傳回行。n 必須是整數常量,@nvar 的資料類型必須為 smallint、tinyint 或 int。

<dt>GLOBAL</dt>

指定 cursor_name 是指全局遊标。

<dt>cursor_name</dt>

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

<dt></dt>

@ cursor_variable_name

遊标變量名,引用要從中進行提取操作的打開的遊标。

<dt>INTO @variable_name[ ,...n]</dt>

允許将提取操作的列資料放到局部變量中。清單中的各個變量從左到右與遊标結果集中的相應列相關聯。各變量的資料類型必須與相應的結果集列的資料類型比對,或是結果集列資料類型所支援的隐式轉換。變量的數目必須與遊标選擇清單中的列數一緻。

sqlserver遊标使用

  注釋

如果 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 選項。

sqlserver遊标使用

  權限

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

sqlserver遊标使用

  示例

以下示例為 <code>Person.Contact</code> 表中姓氏以字母 <code>B</code> 開頭的行聲明了一個簡單的遊标,并使用 <code>FETCH NEXT</code> 逐個提取這些行。<code>FETCH</code> 語句以單行結果集形式傳回在 <code>DECLARE CURSOR</code> 中指定的列的值。

<a href="http://blog.csdn.net/luminji/article/details/5130004">複制代碼</a>

以下示例與示例 A 相似,但 <code>FETCH</code> 語句的輸出存儲于局部變量而不是直接傳回到用戶端。<code>PRINT</code> 語句将變量組合成單一字元串并将其傳回到用戶端。

以下示例建立一個 <code>SCROLL</code> 遊标,使其通過 <code>LAST</code>、<code>PRIOR</code>、<code>RELATIVE</code> 和 <code>ABSOLUTE</code> 選項支援全部滾動功能。

另外,再舉一個簡單的例子:

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&lt;10   

  begin   

      set   @i   =   @i+1   

  end   

  SQL   SERVER不支援FOR循環

sqlserver遊标使用

  文法