sp_cursor (Transact-SQL)
適用於:SQL Server
要求定位更新。 此程式會在數據指標擷取緩衝區內的一或多個數據列上執行作業。 在表格式數據流 (TDS) 封包中指定 ID = 1 來叫用sp_cursor。
適用於:SQL Server (SQL Server 2008 (10.0.x) 到最新版本)。 |
語法
sp_cursor cursor, optype, rownum, table
[ , value[...n]]]
引數
cursor
游標控點。 cursor 是呼叫 int 輸入值的必要參數。 cursor 是 SQL 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 參數
使用值的規則有兩個替代方法,如自變數一節稍早所述:
您可以針對任何具名 值 參數,使用 '@' 預先寫在 select-list 中數據行的名稱。 此替代方法的其中一個優點是數據轉換可能不需要。
使用參數來提交完整的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)
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: