sp_cursoropen (Transact-SQL)
開啟資料指標。 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) 上提供這個值。 cursor 是具有 int 傳回值的必要參數。cursor 允許多個資料指標在單一資料庫連接上運作。
stmt
這是定義資料指標結果集的必要參數。 任何字串類型 (不論是否為 Unicode 或大小等條件為何) 的任何有效查詢字串 (語法和繫結) 都可以當做有效的 stmt 值類型。scrollopt
捲動選項。 scrollopt 是需要下列其中一個 int 輸入值的選擇性參數。值
說明
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 輸入值的選擇性參數。值
說明
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 表示要放入提取緩衝區中的資料列數目。
[!附註]
當指定 AUTO_FETCH 時,>0 是有效的值,否則會予以忽略。
表示結果集中的資料列數目,除非指定 scrollopt AUTO_FETCH 值。
boundparam
表示使用其他參數。 boundparam 是選擇性參數,如果 scrollopt PARAMETERIZED_STMT 值設定為 ON 就應該指定這個參數。
傳回碼值
如果引發了錯誤,sp_cursoropen 會傳回下列其中一個值。
0
已成功執行程序。0x0001
執行期間發生錯誤 (不是太嚴重的錯誤,所以不會引發操作錯誤)。0x0002
非同步作業進行中。0x0002
FETCH 作業進行中。A
這個資料指標已經由 SQL Server 取消配置而且無法使用。
當引發錯誤時,傳回值可能會不一致,而且無法保證其精確度。
當 rowcount 參數指定為傳回值時,將會發生下列結果集。
-1
當資料列數未知或不適用時傳回。-n
當非同步擴展在作用中時傳回。 表示當指定了 scrollopt AUTO_FETCH 值時,放入提取緩衝區中的資料列數目。
如果 RPC 在使用中,傳回值如下。
0
程序成功。1
程序失敗。2
正在以非同步方式產生索引鍵集資料指標。16
已經自動關閉向前快轉的資料指標。
[!附註]
如果 sp_cursoropen 程序執行成功,RPC 會傳回參數和結果集,而且會傳送 TDS 資料行格式資訊 (0xa0 & 0xa1 訊息)。 如果不成功,則會傳送一個或多個 TDS 錯誤訊息。 在任何一個情況下,不會傳回任何資料列資料,而且「完成」訊息計數將會是零。 如果您正在使用早於 7.0 的 SQL Server 版本,則會傳回 0xa0、0xa1 (SELECT 陳述式的標準) 連同 0xa5 和 0xa4 Token 資料流。 如果您正在使用 SQL Server 7.0,則會傳回 0x81 (SELECT 陳述式的標準) 連同 0xa5 和 0xa4 Token 資料流。
備註
stmt 參數
如果 stmt 指定執行預存程序,輸入參數可能會定義為 stmt 字串之一部分的常值,或是指定為 boundparam 引數。 宣告的變數可依照這種方式傳遞為繫結參數。
允許的 stmt 參數內容取決於 ccopt ALLOW_DIRECT 傳回值是否已經透過 OR 連結到其餘的 ccopt 值,也就是:
如果未指定 ALLOW_DIRECT,則必須使用 Transact-SQL SELECT 或 EXECUTE 陳述式呼叫包含單一 SELECT 陳述式的預存程序。 此外,SELECT 陳述式必須符合資料指標的資格,也就是說,它不得包含關鍵字 SELECT INTO 或 FOR BROWSE。
如果指定了 ALLOW_DIRECT,這可能會產生一個或多個 Transact-SQL 陳述式,包括之後搭配多個陳述式執行其他預存程序的那些陳述式。 非 SELECT 陳述式或包含關鍵字 SELECT INTO 或 FOR BROWSE 的任何 SELECT 陳述式將只會執行,而不會建立資料指標。 包括在多個陳述式批次內的任何 SELECT 陳述式也是相同的情況。 如果 SELECT 陳述式包含只與資料指標有關的子句,將會忽略這些子句。 例如,當 ccopt 的值是 0x2002 時,這會要求:
如果只有單一 SELECT 陳述式符合資料指標的資格,則為具有捲動鎖定的資料指標,或是
如果有多個陳述式、單一非 SELECT 陳述式或者不符合資料指標資格的 SELECT 陳述式,則為直接執行陳述式。
scrollopt 參數
前五個 scrollopt 值 (KEYSEY、DYNAMIC、FORWARD_ONLY、STATIC 和 FAST_FORWARD) 互斥。
PARAMETERIZED_STMT 和 CHECK_ACCEPTED_TYPES 可以透過 OR 連結到前五個值的任何一個。
AUTO_FETCH 和 AUTO_CLOSE 可以透過 OR 連結到 FAST_FORWARD。
如果 CHECK_ACCEPTED_TYPES 為 ON,最後五個 scrollopt 值 (KEYSET_ACCEPTABLE、DYNAMIC_ACCEPTABLE、FORWARD_ONLY_ACCEPTABLE、STATIC_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 資料流中傳回資料指標選取清單中繼資料。
範例
bound_param 參數
第五個之後的任何參數都會當做輸入參數傳遞給陳述式計畫。 第一個參數必須是以下格式的字串:
{ local variable name data type } [,…n]
後續的參數會用來傳遞要替代陳述式中 local variable name 的值。