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 | 插入 | 插入資料而不建置 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 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應