共用方式為


sp_cursoropen (Transact-SQL)

適用於:SQL Server

開啟資料指標。 sp_cursoropen 定義與數據指標和數據指標選項相關聯的 SQL 語句,然後填入數據指標。 sp_cursoropen 相當於 Transact-SQL 語句 DECLARE_CURSOROPEN的組合。 這個程式是藉由在表格式數據流 (TDS) 封包中指定 ID = 2 來叫用。

Transact-SQL 語法慣例

語法

sp_cursoropen cursor OUTPUT
    , stmt
    [ , scrollopt [ OUTPUT ]
    [ , ccopt [ OUTPUT ]
    [ , rowcount OUTPUT [ , boundparam ] [ , ...n ] ] ] ]
[ ; ]

引數

重要

擴充預存程式的自變數必須依特定順序輸入,如 語法 一節所述。 如果參數依序輸入,就會發生錯誤訊息。

cursor

SQL Server 產生的數據指標標識碼。 cursorhandle 必須在涉及資料指標的所有後續程式上提供的值,例如 sp_cursorfetch。 資料 指標 參數為 int ,不能為 NULL

cursor 允許在單一資料庫連接上使用多個數據指標。

stmt

定義數據指標結果集的必要參數。 任何字串類型的任何有效查詢字串(語法和系結)都可以做為有效的 stmt 實值類型。

scrollopt

捲動選項。 scrollopt 參數為 intNULL,而且可以是下列其中一個值。

Description
0x0001 KEYSET
0x0002 DYNAMIC
0x0004 FORWARD_ONLY
0x0008 STATIC
0x10 FAST_FORWARD
0x1000 PARAMETERIZED_STMT
0x2000 AUTO_FETCH
0x4000 AUTO_CLOSE
0x8000 CHECK_ACCEPTED_TYPES
0x10000 KEYSET_ACCEPTABLE
0x20000 DYNAMIC_ACCEPTABLE
0x40000 FORWARD_ONLY_ACCEPTABLE
0x80000 STATIC_ACCEPTABLE
0x100000 FAST_FORWARD_ACCEPTABLE

由於要求的值可能不適合 stmt定義的數據指標,因此此參數可做為輸入和輸出。 在這種情況下,SQL Server 會指派適當的值。

ccopt

並行控制選項。 ccopt 是選擇性參數,需要下列 其中一個 int 輸入值。

Description
0x0001 READ_ONLY
0x0002 SCROLL_LOCKS (先前稱為 LOCKCC
0x0004 OPTIMISTIC (先前稱為 OPTCC
0x0008 OPTIMISTIC (先前稱為 OPTCCVAL
0x2000 ALLOW_DIRECT
0x4000 UPDT_IN_PLACE
0x8000 CHECK_ACCEPTED_OPTS
0x10000 READ_ONLY_ACCEPTABLE
0x20000 SCROLL_LOCKS_ACCEPTABLE
0x40000 OPTIMISTIC_ACCEPTABLE
0x80000 OPTIMISITC_ACCEPTABLE

如同 scrollopt,SQL Server 可以覆寫所要求的 ccopt 值。

rowcount

要搭配 AUTO_FETCH使用的擷取緩衝區數據列數目。 預設值為20個數據列。 當指派為輸入值與傳回值時,rowcount 的行為會有所不同。

作為輸入值 作為傳回值
AUTO_FETCH 指定 scrollopt 值時,rowcount 代表要放入擷取緩衝區的數據列數目。

注意:> 0當指定 時AUTO_FETCH,是有效的值,但否則會忽略。
表示結果集中的數據列數目,但指定 scrolloptAUTO_FETCH除外。

boundparam

表示使用額外的參數。 boundparam 是選擇性參數,如果 scrolloptPARAMETERIZED_STMT 值設定為 ON,則應該指定此參數。

傳回碼值

如果沒有引發錯誤, sp_cursoropen 則傳回下列其中一個值。

Description
0 程式已順利執行。
0x0001 執行期間發生錯誤(次要錯誤,不足以引發作業中的錯誤)。
0x0002 異步操作正在進行中。
0x0002 FETCH作業正在進行中。
A 此數據指標已解除分配且無法使用。

引發錯誤時,傳回值可能會不一致,且無法保證正確性。

當 rowcount 參數指定為傳回值時,會發生下列結果集。

Description
-1 如果資料欄數目未知或不適用,則傳回 。
-n 當異步母體擴展生效時傳回。 表示指定 scrolloptAUTO_FETCH,放入提取緩衝區的數據列數目。

如果 RPC 正在使用中,則傳回值如下所示。

Description
0 程式成功。
1 程序失敗。
2 索引鍵集數據指標正以異步方式產生。
16 快轉游標會自動關閉。

sp_cursoropen如果程式執行成功,則會傳送具有 TDS 數據行格式資訊(0xa0和訊息)的 RPC 傳回參數和0xa1結果集。 如果失敗,就會傳送一或多個 TDS 錯誤訊息。 在這兩種情況下,不會傳回任何資料列資料, DONE 而且訊息計數為 00x81會連同和 SELECT 令牌數據流一起0xa5傳回 (語句的標準0xa4)。

備註

stmt 參數

如果 stmt 指定預存程式的執行,則輸入參數可能會定義為 stmt 字串的一部分常數,或指定為 boundparam 自變數。 宣告的變數可以透過這種方式傳遞為係結參數。

stmt 參數允許的內容取決於 ccopt 傳回值是否OR

  • 如果未ALLOW_DIRECT指定,則必須使用針對包含單SELECT一語句的預存程式呼叫的 Transact-SQL EXECUTESELECT 語句。 此外, SELECT 語句必須限定為數據指標;也就是說,它不能包含關鍵詞 SELECT INTOFOR BROWSE

  • 如果 ALLOW_DIRECT 已指定,這可能會導致一或多個 Transact-SQL 語句,包括使用多個語句執行其他預存程式的語句。 SELECT非語句或任何SELECT包含關鍵詞SELECT INTOFOR BROWSE 的語句都會執行,而且不會產生數據指標的建立。 在多個語句批次中包含的任何 SELECT 語句也是如此。 如果 SELECT 語句包含只與數據指標相關的子句,則會忽略那些子句。 例如,當ccopt的值0x2002時,這是要求:

    • 具有捲動鎖定的數據指標,如果只有一 SELECT 個語句限定為數據指標,則為 ,或

    • 如果有多個語句、單一非SELECT 語句或 SELECT 不符合數據指標的語句,則為直接語句執行。

scrollopt 參數

前五個 scrollopt 值 (KEYSEY、 、DYNAMICFORWARD_ONLYSTATIC 、 和 FAST_FORWARD) 互斥。

PARAMETERIZED_STMTCHECK_ACCEPTED_TYPES 可以連結 OR 至前五個值中的任何一個。

AUTO_FETCHAUTO_CLOSE 可以連結 ORFAST_FORWARD

如果 CHECK_ACCEPTED_TYPESON,則最後五個 scrollopt 值中至少一個 (KEYSET_ACCEPTABLEDYNAMIC_ACCEPTABLEFORWARD_ONLY_ACCEPTABLESTATIC_ACCEPTABLEFAST_FORWARD_ACCEPTABLE) 也必須是 ON

STATIC數據指標一律會以 開啟。READ_ONLY 這表示基礎表無法透過這個數據指標更新。

ccopt 參數

前四 個 ccopt 值 (READ_ONLYSCROLL_LOCKS和 兩個 OPTIMISTIC 值) 互斥。

注意

選擇前四 個 ccopt 值之一會決定數據指標是唯讀的,還是使用鎖定或開放式方法來防止遺失的更新。 如果未指定 ccopt 值,預設值為 OPTIMISTIC

ALLOW_DIRECTCHECK_ACCEPTED_TYPES 可以連結 OR 至前四個值中的任何一個。

UPDT_IN_PLACE 可以連結 ORREAD_ONLYSCROLL_LOCKS或 其中一個 OPTIMISTIC 值。

如果 CHECK_ACCEPTED_TYPESON,則最後四 個ccopt 值中至少必須有一個 (READ_ONLY_ACCEPTABLESCROLL_LOCKS_ACCEPTABLE和 其中一個 OPTIMISTIC_ACCEPTABLE 值) 也必須是 ON。

UPDATE定位和DELETE函式只能在擷取緩衝區內執行,而且只有在ccoptOPTIMISTIC執行。 如果 SCROLL_LOCKS 是指定的值,則保證作業會成功。 如果 OPTIMISTIC 為指定的值,則如果數據列自上次擷取后變更,作業就會失敗。

此失敗的原因是,當 是指定的值時 OPTIMISTIC ,會藉由比較時間戳或總和檢查碼值來執行開放式貨幣控制函式,如 SQL Server 所決定。 如果其中任何一個數據列不相符,作業就會失敗。

指定 做為傳 UPDT_IN_PLACE 回值會控管下列結果:

  • 如果在具有唯一索引的數據表上執行定位更新時未設定,數據指標會從其工作數據表中刪除數據列,並將它插入數據指標所使用之任何索引鍵數據行的結尾,這會變更這些數據行。

  • 如果設定 ON,數據指標會更新工作數據表原始數據列中的索引鍵數據行。

bound_param 參數

根據程式代碼中的錯誤訊息,當指定參數名稱時,參數名稱應該PARAMETERIZED_STMT。 未指定時 PARAMETERIZED_STMT ,錯誤訊息中未指定任何名稱。

RPC 考慮

RPC RETURN_METADATA 輸入旗標可以設定為 0x0001 ,要求 TDS 數據流中傳回數據指標選取清單元數據。

範例

A. bound_param 參數

第五個之後的任何參數會以輸入參數的形式傳遞至語句計劃。 第一個這類參數必須是下列格式的字串:

<parameter_name> <data_type> [ ,... n ]

後續參數是用來傳遞要取代 <parameter_name> 語句中的 值。