天天看點

從一個小例子認識SQL遊标

1    什麼是遊标:

關系資料庫中的操作會對整個行集起作用。 例如,由 SELECT 語句傳回的行集包括滿足該語句的 WHERE 子句中條件的所有行。 這種由語句傳回的完整行集稱為結果集。 應用程式,特别是互動式聯機應用程式,并不總能将整個結果集作為一個單元來有效地處理。 這些應用程式需要一種機制以便每次處理一行或一部分行。 遊标就是提供這種機制的對結果集的一種擴充。 遊标通過以下方式來擴充結果處理: 允許定位在結果集的特定行。 從結果集的目前位置檢索一行或一部分行。 支援對結果集中目前位置的行進行資料修改。 為由其他使用者對顯示在結果集中的資料庫資料所做的更改提供不同級别的可見性支援。 提供腳本、存儲過程和觸發器中用于通路結果集中的資料的 Transact-SQL 語句。 

——MSDN

不難了解,遊标與其他資料庫操作的最大不同就是對象是單條記錄而不是結果集,一般用于過程化程式裡嵌入的SQL語句。在資料庫服務程式裡用到了自動隐含建立的遊标。

2    基本用法:

2.1 聲明遊标

DECLARE 遊标名 CURSOR

FOR SELECT語句

2.2 打開遊标

OPEN 遊标名

2.3 從遊标擷取資料

FETCH NEXT FROM 遊标名 [ INTO FETCH_LIST ]

從遊标擷取資料需要注意可能到達遊标末尾,以下方法解決這個問題以避免使用者在關閉遊标時産生錯誤

2.4 關閉遊标

CLOSE 遊标名

關閉後不能對遊标進行讀取等操作,但可以使用OPEN語句再次打開

2.5 釋放遊标

DEALLOCATE 遊标名

即删除遊标,不可再使用

3    一個有意思的小例子:

雖然知道了遊标的概念和基本用法,但對于什麼時候用遊标還很模糊,甚至誤認為遊标可以被子查詢所代替。直到遇到了這個有意思的小例子:

表結構如下:

從一個小例子認識SQL遊标

題目要求是:列出從事同一種工作但屬于不同部門的雇員的不同組合

即如下結果:

從一個小例子認識SQL遊标

在想盡了子查詢、表連接配接、建臨時表等等辦法之後,我發現我遇到了一個不可逾越的障礙:無法排除兩個名字組合的唯一性。即:我得到的結果可能是如下

ANAME

BNAME

Adams

James

最終我想到了剛學到的遊标,代碼如下

最終得到了預期結果,但我想這個問題可能不止這一種解法,希望有其他解法的大牛能指點一二 ^^