分享方式:


sp_cursor (Transact-SQL)

適用於:SQL Server

要求定位更新。 此程式會在數據指標擷取緩衝區內的一或多個數據列上執行作業。 在表格式數據流 (TDS) 封包中指定 ID = 1 來叫用sp_cursor。

適用於:SQL Server (SQL Server 2008 (10.0.x) 到最新版本)。

Transact-SQL 語法慣例

語法

  
sp_cursor  cursor, optype, rownum, table  
    [ , value[...n]]]  

引數

cursor
游標控點。 cursor 是呼叫 int 輸入值的必要參數。 cursorSQL Server 所產生的句柄 值,並由sp_cursoropen程式傳回。

optype
這是指定數據指標執行之作業的必要參數。 optype 需要下列 其中一個 int 輸入值。

名稱 描述
0X0001 UPDATE 用來更新擷取緩衝區中的一或多個數據列。 在 rownum 中指定的數據列會重新存取並更新。
0x0002 DELETE 用來刪除擷取緩衝區中的一或多個數據列。 rownum 中指定的數據列會重新存取和刪除。
0X0004 INSERT 插入數據而不建置 SQL INSERT 語句。
0X0008 REFRESH 用來從基礎表重新填入緩衝區,如果更新或刪除因開放式並行控制或更新之後或 UPDATE 之後而失敗,則可用來重新整理數據列。
0X10 LOCK 導致在包含指定數據列的頁面上取得 SQL Server U-Lock。 此鎖定與 S-Locks 相容,但與 X-Locks 或其他 U-Locks 不相容。 可用來實作短期鎖定。
0X20 SETPOSITION 只有在程式發出後續 SQL Server 定位 DELETE 或 UPDATE 語句時,才會使用 。
0X40 ABSOLUTE 只能與 UPDATE 或 DELETE 搭配使用。 ABSOLUTE 只能與 KEYSET 數據指標搭配使用(針對 DYNAMIC 數據指標忽略,且靜態數據指標無法更新0。

注意:如果在尚未擷取的索引鍵集中的數據列上指定 ABSOLUTE,作業可能會使並行檢查失敗,而且無法保證傳回結果。

rownum
指定數據指標將在擷取緩衝區中操作的數據列、更新或刪除。

注意

這不會影響任何 RELATIVE、NEXT 或 PREVIOUS 擷取作業的起點,也不會影響使用 sp_cursor執行的任何更新或刪除。

rownum 是呼叫 int 輸入值的必要參數。

1
表示擷取緩衝區中的第一個數據列。

2
表示擷取緩衝區中的第二個數據列。

3、4、5
表示第三列等等。

n
表示擷取緩衝區中的第 n 個數據列。

0
表示擷取緩衝區中的所有數據列。

注意

僅適用於 UPDATE、DELETE、REFRESH 或 LOCK optype 值。

table
當數據指標定義牽涉到聯結或模棱兩可的數據行名稱是由 value 參數傳回時,可識別 optype 所套用之數據表的數據表名稱。 如果未指定任何特定數據表,則預設值為FROM子句中的第一個數據表。 table 是選擇性參數,需要 String 輸入值。 字串可以指定為任何字元或 UNICODE 資料類型。 table 可以是多部分數據表名稱。

value
用來插入或更新值。 字串參數只能與 UPDATE 和 INSERT optype 值搭配使用。 字串可以指定為任何字元或 UNICODE 資料類型。

注意

用戶可以指派值的參數名稱

傳回碼值

使用 RPC 時,具有緩衝區編號 0 的定位 DELETE 或 UPDATE 作業會針對擷取緩衝區中的每個數據列傳回 ROWcount 為 0 或 1(成功)的 DONE 訊息

備註

optype 參數

除了 SETPOSITION 與 UPDATE、DELETE、REFRESH 或 LOCK 的組合之外;或ABSOLUTE搭配UPDATE或DELETE,optype 值互斥。

UPDATE 值的 SET 子句是從 value 參數建構的

使用 INSERT optype 值的其中一個優點是,您可以避免將非字元數據轉換成插入的字元格式。 這些值會以與 UPDATE 相同的方式指定。 如果未包含任何必要的數據行,INSERT 就會失敗。

  • SETPOSITION 值不會影響任何 RELATIVE、NEXT 或 PREVIOUS 擷取作業的起點,也不會影響使用 sp_cursor 介面執行的任何更新或刪除。 未在擷取緩衝區中指定數據列的任何數位,都會導致位置設定為1,而不會傳回錯誤。 執行 SETPOSITION 之後,位置會維持有效狀態,直到下一個sp_cursorfetch作業、T-SQL FETCH 作業,或透過相同數據指標sp_cursor SETPOSITION 作業為止。 後續sp_cursorfetch作業會將游標的位置設定為新擷取緩衝區中的第一個數據列,而其他數據指標呼叫不會影響位置的值。 SETPOSITION 可以透過 OR 子句與 REFRESH、UPDATE、DELETE 或 LOCK 連結,以便將位置的值設定為上次修改的數據列。

如果未透過 rownum 參數指定提取緩衝區中的數據列,則會將位置設定為1,而不會傳回錯誤。 設定位置之後,它會維持有效狀態,直到下一個sp_cursorfetch作業、T-SQL FETCH 作業或sp_cursor SETPOSITION 作業在相同的數據指標上執行為止。

SETPOSITION 是由 OR 子句連結,其中包含 REFRESH、UPDATE、DELETE 或 LOCK,以將游標位置設定為最後一個修改的數據列。

rownum 參數

如果指定, 可以將 rownum 參數解譯為索引鍵集中的數據列編號,而不是提取緩衝區內的數據列編號。 用戶負責確保維護並行控制。 這表示對於SCROLL_LOCKS數據指標,您必須獨立維護指定數據列的鎖定(這可以透過交易完成)。 針對 OPTIMISTIC 數據指標,您先前必須擷取數據列來執行這項作業。

table 參數

如果 optype 值為 UPDATE 或 INSERT,而且完整更新或 insert 語句會提交為 value 參數,則會忽略指定給數據表的值。

注意

與檢視有關,只能修改參與檢視的一個數據表。 參數數據行名稱必須反映檢視中的數據行名稱,但數據表名稱可以是基礎基表的名稱(在此情況下,sp_cursor會取代檢視名稱)。

value 參數

使用值的規則有兩個替代方法,如自變數一節稍早所述:

  1. 您可以針對任何具名 參數,使用 '@' 預先寫在 select-list 中數據行的名稱。 此替代方法的其中一個優點是數據轉換可能不需要。

  2. 使用參數來提交完整的UPDATE或INSERT語句,或使用多個參數來提交UPDATE或INSERT語句的部分,SQL Server 接著會建置至完整的語句。 本主題稍後的一節可以找到此範例。

範例

替代值參數使用

針對UPDATE:

使用單一參數時,可以使用下列語法提交 UPDATE 語句:

[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,...n]

注意

如果指定 UPDATE <資料表名稱> ,則會忽略針對 資料表 參數指定的任何值。

使用多個參數時,第一個參數必須是下列格式的字串:

[ SET ] <column name> = expression [,...n]

和後續參數的格式必須是:

<column name> = expression [,...n]

在此情況下,<建構的 update 語句中的數據表名稱是 table 參數所指定或預設的數據表名稱>。

針對 INSERT:

使用單一參數時,可以使用下列語法提交 INSERT 語句:

[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,...n] )

注意

如果指定 INSERT <資料表名稱> ,則會忽略為 資料表 參數指定的任何值。

使用多個參數時,第一個參數必須是下列格式的字串:

[ VALUES ( ] <expression> [,...n]

和後續參數的格式必須是:

expression [,...n]

除非指定 VALUES,在此情況下,最後一個運算式後面必須有尾端 “)”。 在此情況下,建構的UPDATE語句中的資料表名稱是 table 參數所指定或預設的資料表名稱>。<

注意

可以將一個參數提交為具名參數,也就是 “@VALUES”。 在此情況下,不會使用其他具名參數。

另請參閱

sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
系統預存程序 (Transact-SQL)