posts - 431,  comments - 344,  trackbacks - 0

          功能:
              定義 Transact-SQL 服務(wù)器游標(biāo)的特性,例如游標(biāo)的滾動(dòng)行為和用于生成游標(biāo)對(duì)其進(jìn)行操作的結(jié)果集的查詢(xún)。DECLARE CURSOR 接受基于 SQL-92 標(biāo)準(zhǔn)的語(yǔ)法和使用一組 Transact-SQL 擴(kuò)展的語(yǔ)法。

          SQL-92 語(yǔ)法
          DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
          FOR select_statement
          [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

          Transact-SQL 擴(kuò)展語(yǔ)法
          DECLARE cursor_name CURSOR
          [ LOCAL | GLOBAL ]
          [ FORWARD_ONLY | SCROLL ]
          [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
          [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
          [ TYPE_WARNING ]
          FOR select_statement
          [ FOR UPDATE [ OF column_name [ ,...n ] ] ]

          SQL-92 參數(shù)
          cursor_name

          是所定義的 Transact-SQL 服務(wù)器游標(biāo)名稱(chēng)。cursor_name 必須遵從標(biāo)識(shí)符規(guī)則。有關(guān)標(biāo)識(shí)符規(guī)則的更多信息,請(qǐng)參見(jiàn)使用標(biāo)識(shí)符。

          INSENSITIVE

          定義一個(gè)游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本。對(duì)游標(biāo)的所有請(qǐng)求都從 tempdb 中的該臨時(shí)表中得到應(yīng)答;因此,在對(duì)該游標(biāo)進(jìn)行提取操作時(shí)返回的數(shù)據(jù)中不反映對(duì)基表所做的修改,并且該游標(biāo)不允許修改。使用 SQL-92 語(yǔ)法時(shí),如果省略 INSENSITIVE,(任何用戶)對(duì)基表提交的刪除和更新都反映在后面的提取中。

          SCROLL

          指定所有的提取選項(xiàng)(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,則 NEXT 是唯一支持的提取選項(xiàng)。如果指定 SCROLL,則不能也指定 FAST_FORWARD。

          select_statement

          是定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn) SELECT 語(yǔ)句。在游標(biāo)聲明的 select_statement 內(nèi)不允許使用關(guān)鍵字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

          如果 select_statement 中的子句與所請(qǐng)求的游標(biāo)類(lèi)型的功能發(fā)生沖突,則 Microsoft? SQL Server? 隱性地將游標(biāo)轉(zhuǎn)換為另一種類(lèi)型。有關(guān)更多信息,請(qǐng)參見(jiàn)隱性游標(biāo)轉(zhuǎn)換。

          READ ONLY

          Prevents updates made through this cursor.在 UPDATE 或 DELETE 語(yǔ)句的 WHERE CURRENT OF 子句中不能引用游標(biāo)。該選項(xiàng)替代要更新的游標(biāo)的默認(rèn)功能。

          UPDATE [OF column_name [,...n]]

          定義游標(biāo)內(nèi)可更新的列。如果指定 OF column_name [,...n] 參數(shù),則只允許修改所列出的列。如果在 UPDATE 中未指定列的列表,則可以更新所有列。

          Transact-SQL 擴(kuò)展參數(shù)
          cursor_name

          是所定義的 Transact-SQL 服務(wù)器游標(biāo)名稱(chēng)。cursor_name 必須遵從標(biāo)識(shí)符規(guī)則。有關(guān)標(biāo)識(shí)符規(guī)則的更多信息,請(qǐng)參見(jiàn)使用標(biāo)識(shí)符。

          LOCAL

          指定該游標(biāo)的作用域?qū)υ谄渲袆?chuàng)建它的批處理、存儲(chǔ)過(guò)程或觸發(fā)器是局部的。該游標(biāo)名稱(chēng)僅在這個(gè)作用域內(nèi)有效。在批處理、存儲(chǔ)過(guò)程、觸發(fā)器或存儲(chǔ)過(guò)程 OUTPUT 參數(shù)中,該游標(biāo)可由局部游標(biāo)變量引用。OUTPUT 參數(shù)用于將局部游標(biāo)傳遞回調(diào)用批處理、存儲(chǔ)過(guò)程或觸發(fā)器,它們可在存儲(chǔ)過(guò)程終止后給游標(biāo)變量指派參數(shù)使其引用游標(biāo)。除非 OUTPUT 參數(shù)將游標(biāo)傳遞回來(lái),否則游標(biāo)將在批處理、存儲(chǔ)過(guò)程或觸發(fā)器終止時(shí)隱性釋放。如果 OUTPUT 參數(shù)將游標(biāo)傳遞回來(lái),游標(biāo)在最后引用它的變量釋放或離開(kāi)作用域時(shí)釋放。

          GLOBAL

          指定該游標(biāo)的作用域?qū)B接是全局的。在由連接執(zhí)行的任何存儲(chǔ)過(guò)程或批處理中,都可以引用該游標(biāo)名稱(chēng)。該游標(biāo)僅在脫接時(shí)隱性釋放。

           

          說(shuō)明  如果 GLOBAL 和 LOCAL 參數(shù)都未指定,則默認(rèn)值由 default to local cursor 數(shù)據(jù)庫(kù)選項(xiàng)的設(shè)置控制。在 SQL Server 7.0 版中,該選項(xiàng)默認(rèn)為 FALSE 以與 SQL Server 早期版本相匹配,在 SQL Server 早期版本中所有游標(biāo)都是全局的。該選項(xiàng)的默認(rèn)值在以后的 SQL Server 版本中可能會(huì)更改。有關(guān)更多信息,請(qǐng)參見(jiàn)設(shè)置數(shù)據(jù)庫(kù)選項(xiàng)。


          FORWARD_ONLY

          指定游標(biāo)只能從第一行滾動(dòng)到最后一行。FETCH NEXT 是唯一受支持的提取選項(xiàng)。如果在指定 FORWARD_ONLY 時(shí)不指定 STATIC、KEYSET 和 DYNAMIC 關(guān)鍵字,則游標(biāo)作為 DYNAMIC 游標(biāo)進(jìn)行操作。如果 FORWARD_ONLY 和 SCROLL 均未指定,除非指定 STATIC、KEYSET 或 DYNAMIC 關(guān)鍵字,否則默認(rèn)為 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游標(biāo)默認(rèn)為 SCROLL。與 ODBC 和 ADO這類(lèi)數(shù)據(jù)庫(kù) API 不同,STATIC、KEYSET 和 DYNAMIC Transact-SQL 游標(biāo)支持 FORWARD_ONLY。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一個(gè),則不能指定另一個(gè)。

          STATIC

          定義一個(gè)游標(biāo),以創(chuàng)建將由該游標(biāo)使用的數(shù)據(jù)的臨時(shí)復(fù)本。對(duì)游標(biāo)的所有請(qǐng)求都從 tempdb 中的該臨時(shí)表中得到應(yīng)答;因此,在對(duì)該游標(biāo)進(jìn)行提取操作時(shí)返回的數(shù)據(jù)中不反映對(duì)基表所做的修改,并且該游標(biāo)不允許修改。

          KEYSET

          指定當(dāng)游標(biāo)打開(kāi)時(shí),游標(biāo)中行的成員資格和順序已經(jīng)固定。對(duì)行進(jìn)行唯一標(biāo)識(shí)的鍵集內(nèi)置在 tempdb 內(nèi)一個(gè)稱(chēng)為 keyset 的表中。對(duì)基表中的非鍵值所做的更改(由游標(biāo)所有者更改或由其它用戶提交)在用戶滾動(dòng)游標(biāo)時(shí)是可視的。其他用戶進(jìn)行的插入是不可視的(不能通過(guò) Transact-SQL 服務(wù)器游標(biāo)進(jìn)行插入)。如果某行已刪除,則對(duì)該行的提取操作將返回 @@FETCH_STATUS 值 -2。從游標(biāo)外更新鍵值類(lèi)似于刪除舊行后接著插入新行的操作。含有新值的行不可視,對(duì)含有舊值的行的提取操作將返回 @@FETCH_STATUS 值 -2。如果通過(guò)指定 WHERE CURRENT OF 子句用游標(biāo)完成更新,則新值可視。

          DYNAMIC

          定義一個(gè)游標(biāo),以反映在滾動(dòng)游標(biāo)時(shí)對(duì)結(jié)果集內(nèi)的行所做的所有數(shù)據(jù)更改。行的數(shù)據(jù)值、順序和成員在每次提取時(shí)都會(huì)更改。動(dòng)態(tài)游標(biāo)不支持 ABSOLUTE 提取選項(xiàng)。

          FAST_FORWARD

          指定啟用了性能優(yōu)化的 FORWARD_ONLY、READ_ONLY 游標(biāo)。如果指定 FAST_FORWARD,則不能也指定 SCROLL 或 FOR_UPDATE。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一個(gè),則不能指定另一個(gè)。

          READ_ONLY

          禁止通過(guò)該游標(biāo)進(jìn)行更新。在 UPDATE 或 DELETE 語(yǔ)句的 WHERE CURRENT OF 子句中不能引用游標(biāo)。該選項(xiàng)替代要更新的游標(biāo)的默認(rèn)功能。

          SCROLL_LOCKS

          指定確保通過(guò)游標(biāo)完成的定位更新或定位刪除可以成功。當(dāng)將行讀入游標(biāo)以確保它們可用于以后的修改時(shí),Microsoft? SQL Server? 會(huì)鎖定這些行。如果還指定了 FAST_FORWARD,則不能指定 SCROLL_LOCKS。

          OPTIMISTIC

          指定如果行自從被讀入游標(biāo)以來(lái)已得到更新,則通過(guò)游標(biāo)進(jìn)行的定位更新或定位刪除不成功。當(dāng)將行讀入游標(biāo)時(shí) SQL Server 不鎖定行。相反,SQL Server 使用 timestamp 列值的比較,或者如果表沒(méi)有 timestamp 列則使用校驗(yàn)值,以確定將行讀入游標(biāo)后是否已修改該行。如果已修改該行,嘗試進(jìn)行的定位更新或定位刪除將失敗。如果還指定了 FAST_FORWARD,則不能指定 OPTIMISTIC。

          TYPE_WARNING

          指定如果游標(biāo)從所請(qǐng)求的類(lèi)型隱性轉(zhuǎn)換為另一種類(lèi)型,則給客戶端發(fā)送警告消息。

          select_statement

          是定義游標(biāo)結(jié)果集的標(biāo)準(zhǔn) SELECT 語(yǔ)句。在游標(biāo)聲明的 select_statement 內(nèi)不允許使用關(guān)鍵字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

          如果 select_statement 內(nèi)的子句與所請(qǐng)求的游標(biāo)類(lèi)型沖突,SQL Server 將游標(biāo)隱性轉(zhuǎn)換成另一種類(lèi)型。有關(guān)更多信息,請(qǐng)參見(jiàn)隱性游標(biāo)轉(zhuǎn)換。

          UPDATE [OF column_name [,...n]]

          定義游標(biāo)內(nèi)可更新的列。如果提供了 OF column_name [,...n],則只允許修改列出的列。如果在 UPDATE 中未指定列的列表,除非指定了 READ_ONLY 并發(fā)選項(xiàng),否則所有列均可更新。

          注釋
          DECLARE CURSOR 定義 Transact-SQL 服務(wù)器游標(biāo)的特性,例如游標(biāo)的滾動(dòng)行為和用于生成游標(biāo)對(duì)其進(jìn)行操作的結(jié)果集的查詢(xún)。OPEN 語(yǔ)句填充結(jié)果集,F(xiàn)ETCH 從結(jié)果集返回行。CLOSE 語(yǔ)句釋放與游標(biāo)關(guān)聯(lián)的當(dāng)前結(jié)果集。DEALLOCATE 語(yǔ)句釋放游標(biāo)所使用的資源。

          DECLARE CURSOR 語(yǔ)句的第一種格式使用 SQL-92 語(yǔ)法聲明游標(biāo)行為。DECLARE CURSOR 的第二種格式使用 Transact-SQL 擴(kuò)展,使您得以使用在 ODBC、ADO 和 DB-Library的數(shù)據(jù)庫(kù) API 游標(biāo)函數(shù)中的相同游標(biāo)類(lèi)型定義游標(biāo)。

          不能混淆這兩種格式。如果在 CURSOR 關(guān)鍵字的前面指定 SCROLL 或 INSENSITIVE 關(guān)鍵字,則不能在 CURSOR 和 FOR select_statement 關(guān)鍵字之間使用任何關(guān)鍵字。如果在 CURSOR 和 FOR select_statement 關(guān)鍵字之間指定任何關(guān)鍵字,則不能在 CURSOR 關(guān)鍵字的前面指定 SCROLL 或 INSENSITIVE。

          如果使用 Transact-SQL 語(yǔ)法的 DECLARE CURSOR 不指定 READ_ONLY、OPTIMISTIC 或 SCROLL_LOCKS,則默認(rèn)設(shè)置如下:

          如果 SELECT 語(yǔ)句不支持更新(權(quán)限不夠,訪問(wèn)的遠(yuǎn)程表不支持更新,等等),則游標(biāo)是 READ_ONLY。


          STATIC 和FAST_FORWARD 游標(biāo)默認(rèn)為 READ_ONLY。


          DYNAMIC 和 KEYSET 游標(biāo)默認(rèn)為 OPTIMISTIC。
          游標(biāo)名稱(chēng)只能由其它 Transact-SQL 語(yǔ)句引用,不能由數(shù)據(jù)庫(kù) API 函數(shù)引用。例如,在聲明游標(biāo)后,不能從 OLE DB、ODBC、ADO 或 DB-Library 函數(shù)或方法引用游標(biāo)名稱(chēng)。游標(biāo)行不能通過(guò) API 提取函數(shù)或方法提取,而只能由 Transact-SQL FETCH 語(yǔ)句提取。

          在聲明游標(biāo)后,可使用下列系統(tǒng)存儲(chǔ)過(guò)程確定游標(biāo)的特性。

          系統(tǒng)存儲(chǔ)過(guò)程 描述
          sp_cursor_list 返回當(dāng)前在連接上可視的游標(biāo)列表及其特性。
          sp_describe_cursor 描述游標(biāo)特性,比如是只進(jìn)游標(biāo)還是滾動(dòng)游標(biāo)。
          sp_describe_cursor_columns 描述游標(biāo)結(jié)果集中的列的特性。
          sp_describe_cursor_tables 描述游標(biāo)所訪問(wèn)的基表。


          變量可作為聲明游標(biāo)的 select_statement 的一部分使用。然而,在游標(biāo)聲明之后對(duì)那些變量的更改將不會(huì)對(duì)游標(biāo)的操作產(chǎn)生影響。

          權(quán)限
          默認(rèn)情況下,將 DECLARE CURSOR 權(quán)限授予對(duì)游標(biāo)中所使用的視圖、表和列有 SELECT 權(quán)限的任何用戶。

          示例
          A. 使用簡(jiǎn)單游標(biāo)和語(yǔ)法
          打開(kāi)該游標(biāo)時(shí)所生成的結(jié)果集包括 pubs 數(shù)據(jù)庫(kù)的 authors 表中的所有行和列。可以更新該游標(biāo),對(duì)該游標(biāo)所做的所有更新和刪除均在提取中表現(xiàn)出來(lái)。因?yàn)闆](méi)指定 SCROLL 選項(xiàng),F(xiàn)ETCH NEXT 是唯一可用的提取選項(xiàng)。

          DECLARE authors_cursor CURSOR
             FOR SELECT * FROM authors
          OPEN authors_cursor
          FETCH NEXT FROM authors_cursor

          B. 使用嵌套游標(biāo)生成報(bào)表輸出
          下例顯示如何嵌套游標(biāo)以生成復(fù)雜的報(bào)表。為每個(gè)作者聲明內(nèi)部游標(biāo)。

          SET NOCOUNT ON

          DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
             @message varchar(80), @title varchar(80)

          PRINT "-------- Utah Authors report --------"

          DECLARE authors_cursor CURSOR FOR
          SELECT au_id, au_fname, au_lname
          FROM authors
          WHERE state = "UT"
          ORDER BY au_id

          OPEN authors_cursor

          FETCH NEXT FROM authors_cursor
          INTO @au_id, @au_fname, @au_lname

          WHILE @@FETCH_STATUS = 0
          BEGIN
             PRINT " "
             SELECT @message = "----- Books by Author: " +
                @au_fname + " " + @au_lname

             PRINT @message

             -- Declare an inner cursor based  
             -- on au_id from the outer cursor.

             DECLARE titles_cursor CURSOR FOR
             SELECT t.title
             FROM titleauthor ta, titles t
             WHERE ta.title_id = t.title_id AND
             ta.au_id = @au_id   -- Variable value from the outer cursor

             OPEN titles_cursor
             FETCH NEXT FROM titles_cursor INTO @title

             IF @@FETCH_STATUS <> 0
                PRINT "         <<No Books>>"    

             WHILE @@FETCH_STATUS = 0
             BEGIN
               
                SELECT @message = "         " + @title
                PRINT @message
                FETCH NEXT FROM titles_cursor INTO @title
            
             END

             CLOSE titles_cursor
             DEALLOCATE titles_cursor
            
             -- Get the next author.
             FETCH NEXT FROM authors_cursor
             INTO @au_id, @au_fname, @au_lname
          END

          CLOSE authors_cursor
          DEALLOCATE authors_cursor
          GO

          -------- Utah Authors report --------
           
          ----- Books by Author: Anne Ringer
                   The Gourmet Microwave
                   Is Anger the Enemy?
           
          ----- Books by Author: Albert Ringer
                   Is Anger the Enemy?
                   Life Without Fear

          posted on 2008-08-28 11:06 周銳 閱讀(1346) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): SQL Server
          主站蜘蛛池模板: 红原县| 绥芬河市| 宁晋县| 兴业县| 永州市| 大渡口区| 吴川市| 德州市| 玛纳斯县| 金乡县| 拜城县| 峡江县| 连平县| 岫岩| 额济纳旗| 金门县| 邹平县| 苍梧县| 阳谷县| 南昌市| 邳州市| 桦川县| 贡山| 华宁县| 余干县| 婺源县| 卓尼县| 南和县| 汶川县| 石家庄市| 北川| 平阴县| 横山县| 靖宇县| 陕西省| 环江| 白城市| 济源市| 聂荣县| 辽源市| 枞阳县|