sp_cursoropen (Transact-SQL)
適用於:SQL Server
開啟資料指標。 sp_cursoropen
定義與數據指標和數據指標選項相關聯的 SQL 語句,然後填入數據指標。 sp_cursoropen
相當於 Transact-SQL 語句 DECLARE_CURSOR
和 OPEN
的組合。 這個程式是藉由在表格式數據流 (TDS) 封包中指定 ID = 2
來叫用。
語法
sp_cursoropen cursor OUTPUT
, stmt
[ , scrollopt [ OUTPUT ]
[ , ccopt [ OUTPUT ]
[ , rowcount OUTPUT [ , boundparam ] [ , ...n ] ] ] ]
[ ; ]
引數
cursor
SQL Server 產生的數據指標標識碼。 cursor 是 handle
必須在涉及資料指標的所有後續程式上提供的值,例如 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
而且訊息計數為 0
。 0x81
會連同和 0xa4
令牌數據流一起0xa5
傳回 (語句的標準SELECT
)。
備註
stmt 參數
如果 stmt 指定預存程式的執行,則輸入參數可能會定義為 stmt 字串的一部分常數,或指定為 boundparam 自變數。 宣告的變數可以透過這種方式傳遞為係結參數。
stmt 參數允許的內容取決於 ccopt 傳回值是否由 其餘的 ccopt ALLOW_DIRECT
值連結:OR
如果未
ALLOW_DIRECT
指定,則必須使用針對包含單SELECT
一語句的預存程式呼叫的 Transact-SQLSELECT
或EXECUTE
語句。 此外,SELECT
語句必須限定為數據指標;也就是說,它不能包含關鍵詞SELECT INTO
或FOR BROWSE
。如果
ALLOW_DIRECT
已指定,這可能會導致一或多個 Transact-SQL 語句,包括使用多個語句執行其他預存程式的語句。SELECT
非語句或任何SELECT
包含關鍵詞SELECT INTO
或FOR BROWSE
的語句都會執行,而且不會產生數據指標的建立。 在多個語句批次中包含的任何SELECT
語句也是如此。 如果SELECT
語句包含只與數據指標相關的子句,則會忽略那些子句。 例如,當ccopt的值是0x2002
時,這是要求:具有捲動鎖定的數據指標,如果只有一
SELECT
個語句限定為數據指標,則為 ,或如果有多個語句、單一非
SELECT
語句或SELECT
不符合數據指標的語句,則為直接語句執行。
scrollopt 參數
前五個 scrollopt 值 (KEYSEY
、 、STATIC
FORWARD_ONLY
DYNAMIC
、 和 FAST_FORWARD
) 互斥。
PARAMETERIZED_STMT
和 CHECK_ACCEPTED_TYPES
可以連結 OR
至前五個值中的任何一個。
AUTO_FETCH
與 AUTO_CLOSE
可以連結 OR
至 FAST_FORWARD
。
如果 CHECK_ACCEPTED_TYPES
為 ON
,則最後五個 scrollopt 值中至少一個 (KEYSET_ACCEPTABLE
、 DYNAMIC_ACCEPTABLE
、 STATIC_ACCEPTABLE
FORWARD_ONLY_ACCEPTABLE
或 FAST_FORWARD_ACCEPTABLE
) 也必須是 ON
。
STATIC
數據指標一律會以 開啟。READ_ONLY
這表示基礎表無法透過這個數據指標更新。
ccopt 參數
前四 個 ccopt 值 (READ_ONLY
、 SCROLL_LOCKS
和 兩個 OPTIMISTIC
值) 互斥。
注意
選擇前四 個 ccopt 值之一會決定數據指標是唯讀的,還是使用鎖定或開放式方法來防止遺失的更新。 如果未指定 ccopt 值,預設值為 OPTIMISTIC
。
ALLOW_DIRECT
和 CHECK_ACCEPTED_TYPES
可以連結 OR
至前四個值中的任何一個。
UPDT_IN_PLACE
可以連結 OR
至 READ_ONLY
、 SCROLL_LOCKS
或 其中一個 OPTIMISTIC
值。
如果 CHECK_ACCEPTED_TYPES
為 ON
,則最後四 個ccopt 值中至少必須有一個 (READ_ONLY_ACCEPTABLE
、 SCROLL_LOCKS_ACCEPTABLE
和 其中一個 OPTIMISTIC_ACCEPTABLE
值) 也必須是 ON。
UPDATE
定位和DELETE
函式只能在擷取緩衝區內執行,而且只有在ccopt值等於 SCROLL_LOCKS
或OPTIMISTIC
時才執行。 如果 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>
語句中的 值。