分享方式:


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 參數為 int,預設值NULL,而且可以是下列其中一個值。

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,是有效的值,但否則會忽略。
表示結果集中的數據列數目,但指定 scrollopt AUTO_FETCH 值時除外。

boundparam

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

傳回碼值

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

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

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

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

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

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

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

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

備註

stmt 參數

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

stmt 參數允許的內容取決於 ccopt 傳回值是否由 其餘的 ccopt ALLOW_DIRECT值連結:OR

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

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

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

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

scrollopt 參數

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

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

AUTO_FETCHAUTO_CLOSE 可以連結 ORFAST_FORWARD

如果 CHECK_ACCEPTED_TYPESON,則最後五個 scrollopt 值中至少一個 (KEYSET_ACCEPTABLEDYNAMIC_ACCEPTABLESTATIC_ACCEPTABLEFORWARD_ONLY_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函式只能在擷取緩衝區內執行,而且只有在ccopt值等於 SCROLL_LOCKSOPTIMISTIC時才執行。 如果 SCROLL_LOCKS 是指定的值,則保證作業會成功。 如果 OPTIMISTIC 為指定的值,則如果數據列自上次擷取后變更,作業就會失敗。

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

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

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

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

bound_param 參數

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

RPC 考慮

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

範例

A. bound_param 參數

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

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

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