分享方式:


sp_cursor (Transact-SQL)

適用於:SQL Server

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

Transact-SQL 語法慣例

語法

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 只有在程式要發出後續 DELETEUPDATE 語句時,才會使用 。
0X40 ABSOLUTE 只能與 或DELETE搭配UPDATE使用。 ABSOLUTE 只會與數據指標搭配 KEYSET 使用(針對數據指標忽略 DYNAMIC ),而且 STATIC 無法更新數據指標。

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

rownum

指定數據指標在擷取緩衝區中操作、更新或刪除的數據列。 此參數不會影響任何 RELATIVENEXTPREVIOUS 擷取作業的起點,也不會影響使用 sp_cursor執行的任何更新或刪除。

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

  • 1

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

  • 2, 3, 4, ...n

    表示第二個、第三個和第四個數據列等等。

  • 0

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

此參數只適用於UPDATEDELETEREFRESH、 或 LOCK optype 值。

table

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

value

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

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

傳回碼值

0 (成功) 或 1 (失敗)。

備註

optype 參數

除了與 、、 或 的組合,或是 DELETEABSOLUTEUPDATE UPDATE或 ,optype 值互斥。SETPOSITION LOCKREFRESHDELETE

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

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

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

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

SETPOSITION可以透過 OR 子句與REFRESHUPDATEDELETELOCK 連結,將游標位置設定為最後一個修改的數據列。

rownum 參數

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

數據表參數

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

注意

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

value 參數

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

  1. 您可以針對任何具名參數,使用選取清單中數據行名稱前面加上的名稱@。 此替代方法的其中一個優點是數據轉換可能不需要。

  2. 使用參數來提交完整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。 在此情況下,無法使用其他具名參數。