sp_cursor (Transact-SQL)
適用於:SQL Server
要求定位更新。 此程式會在數據指標擷取緩衝區內的一或多個數據列上執行作業。 sp_cursor
是在表格式資料流 (TDS) 封包中指定 ID = 1
來叫用。
語法
sp_cursor cursor , optype , rownum , table
[ , value [ ...n ] ]
[ ; ]
引數
cursor
游標控點。 資料 指標 參數為 int,不能為 NULL
。 此參數是由 handle
資料庫引擎 產生的值,並由程式傳sp_cursoropen
回。
optype
指定數據指標執行之作業的必要參數。 optype 參數需要下列其中一個值。
值 | 名稱 | 描述 |
---|---|---|
0X0001 |
UPDATE |
用來更新擷取緩衝區中的一或多個數據列。 rownum 中指定的數據列會重新取得並更新。 |
0x0002 |
DELETE |
用來刪除擷取緩衝區中的一或多個數據列。 rownum 中指定的數據列會重新取得並刪除。 |
0X0004 |
INSERT |
插入數據而不建置 INSERT 語句。 |
0X0008 |
REFRESH |
用來從基礎表重新填入緩衝區,如果更新或刪除因開放式並行控制或之後或 之後 UPDATE 而失敗,則可用來重新整理數據列。 |
0X10 |
LOCK |
導致在包含指定數據列的頁面上取得更新鎖定 (U)。 此鎖定與共用鎖定 (S) 相容,但與獨佔鎖定 (X) 或其他更新鎖定不相容。 可用來實作短期鎖定。 |
0X20 |
SETPOSITION |
只有在程式要發出後續 DELETE 或 UPDATE 語句時,才會使用 。 |
0X40 |
ABSOLUTE |
只能與 或DELETE 搭配UPDATE 使用。 ABSOLUTE 只會與數據指標搭配 KEYSET 使用(針對數據指標忽略 DYNAMIC ),而且 STATIC 無法更新數據指標。注意: 如果在 ABSOLUTE 尚未擷取的索引鍵集中的數據列上指定 ,作業可能會使並行檢查失敗,而且無法保證傳回結果。 |
rownum
指定數據指標在擷取緩衝區中操作、更新或刪除的數據列。 此參數不會影響任何 RELATIVE
、 NEXT
或 PREVIOUS
擷取作業的起點,也不會影響使用 sp_cursor
執行的任何更新或刪除。
rownum 是呼叫 int 輸入值的必要參數。
1
表示擷取緩衝區中的第一個數據列。
2, 3, 4, ...n
表示第二個、第三個和第四個數據列等等。
0
表示擷取緩衝區中的所有數據列。
此參數只適用於UPDATE
、 DELETE
REFRESH
、 或 LOCK
optype 值。
table
當數據指標定義涉及聯結時,可識別 optype 所套用之數據表的數據表名稱,或值參數會傳回模棱兩可的數據行名稱。 如果未指定任何特定數據表,則預設值為 子句中的 FROM
第一個數據表。 數據表參數是選擇性的,而且需要字串輸入值。 字串可以指定為任何字元或 Unicode 資料類型,或多部分數據表名稱。
value
用來插入或更新值。 值字串參數只能與 和 INSERT
optype 值搭配UPDATE
使用。 字串可以指定為任何字元或 Unicode 資料類型。
用戶可以指派值的參數名稱。
傳回碼值
0
(成功) 或 1
(失敗)。
備註
optype 參數
除了與 、、 或 的組合,或是 DELETE
ABSOLUTE
UPDATE
或UPDATE
或 ,optype 值互斥。SETPOSITION
LOCK
REFRESH
DELETE
值的 SET
子句UPDATE
是從 value 參數建構的。
使用 INSERT <optype>
值的其中一個優點是,您可以避免將非字元數據轉換成插入的字元格式。 這些值會以與 UPDATE
相同的方式指定。 如果未包含任何必要的數據行,則會 INSERT
失敗。
- 值
SETPOSITION
不會影響任何RELATIVE
、NEXT
或PREVIOUS
擷取作業的起點,也不會影響使用sp_cursor
介面執行的任何更新或刪除。 未在擷取緩衝區中指定數據列的任何數位,都會導致位置設定為1
,且不會傳回錯誤。 執行之後SETPOSITION
,位置會維持有效狀態,直到下一個sp_cursorfetch
作業、T-SQLFETCH
作業或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
數據指標,您先前必須擷取數據列才能執行這項作業。
數據表參數
如果 optype 值為 UPDATE
或 INSERT
,而且完整更新或插入語句會提交為 value 參數,則會忽略指定給數據表的值。
注意
與檢視有關,只能修改參與檢視的一個數據表。 值參數數據行名稱必須反映檢視中的數據行名稱,但數據表名稱可以是基礎基表的名稱(在此情況下sp_cursor
會取代檢視名稱)。
value 參數
使用值的規則有兩個替代方法,如自變數一節稍早所述:
您可以針對任何具名值參數,使用選取清單中數據行名稱前面加上的名稱
@
。 此替代方法的其中一個優點是數據轉換可能不需要。使用參數來提交完整
UPDATE
或語句,INSERT
或使用多個參數來提交 或INSERT
語句的部分UPDATE
,資料庫引擎 接著會建置成完整語句。 您可以在本文稍後的 一節中找到範例 。
範例
替代值參數使用
針對UPDATE
使用單一參數時, UPDATE
可能會使用下列語法提交語句:
[ [ UPDATE <table_name> ] SET ] { <column name> = expression } [ , ...n ]
如果UPDATE <table_name>
已指定,則會忽略數據表參數所指定的任何值。
使用多個參數時,第一個參數必須是下列格式的字串:
[ SET ] <column name> = expression [ , ...n ]
後續參數的格式必須是:
<column name> = expression [ , ...n ]
在此情況下,<table_name>
建構的 update 語句中的 是 table 參數所指定或預設的更新語句。
針對 INSERT
使用單一參數時, INSERT
可能會使用下列語法提交語句:
[ [ INSERT [ INTO ] <table_name> ] VALUES ] ( <expression> [ , ...n ] )
如果INSERT <table_name>
已指定,則會忽略數據表參數所指定的任何值。
使用多個參數時,第一個參數必須是下列格式的字串:
[ VALUES ] ( <expression> [ , ...n ] )
後續參數的格式必須為 expression [ , ...n ]
,但指定的 除外 VALUES
,在此情況下,最後一個運算式後面必須有尾 )
端。 在此情況下,<table_name>
建構UPDATE
語句中的 是 table 參數所指定或預設的 語句。
注意
可以將一個參數提交為具名參數,例如 @values
。 在此情況下,無法使用其他具名參數。