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 輸入值的必要參數。 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 參數

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

  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)