sp_cursor (Transact-SQL)

要求定點更新。 這個程序會針對資料指標的提取緩衝區內的一個或多個資料列執行作業。 sp_cursor 的叫用方式是在表格式資料流 (TDS) 封包中指定 ID = 1。

主題連結圖示 Transact-SQL 語法慣例

語法

sp_cursor  cursor, optype, rownum, table
    [ , value [...n] ] ]

引數

  • cursor
    資料指標控制代碼。 cursor 是呼叫 int 輸入值的必要參數。 cursor 是 SQL Server 所產生,以及 sp_cursoropen 程序所傳回的「控制代碼」(Handle) 值。

  • 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 資料指標和 STATIC 資料指標則會忽略,而且無法更新)。

    [!附註]

    如果在尚未提取之索引鍵集內的資料列上指定 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 是需要字串輸入值的選擇性參數。 此字串可以指定為任何字元或 UNICODE 資料類型。 table 可以是多部分的資料表名稱。

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

    [!附註]

    使用者可以指派 value 的參數名稱。

傳回碼值

當使用 RPC 時,緩衝區編號 0 的定位 DELETE 或 UPDATE 作業將會針對提取緩衝區內的每一個資料列傳回 DONE 訊息,而且 rowcount 為 0 (失敗) 或 1 (成功)。

備註

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 而且完整更新或插入陳述式提交為 value 參數,則會忽略為 table 指定的值。

[!附註]

與檢視表有關,只能修改參與檢視表的一個資料表。 value 參數資料行名稱必須反映檢視表中的資料行名稱,但是資料表名稱可以是基底資料表的名稱 (此時 sp_cursor 將會替代檢視表名稱)。

value 參數

使用 value 的規則有兩個替代方案,如之前<引數>一節所述:

  1. 您可以針對任何具名的 value 參數,使用選取清單中資料行名稱的前面所加上的名稱 (帶有 '@')。 這個替代方案的一個優點是可能不需要轉換資料。

  2. 使用一個參數來提交完整的 UPDATE 或 INSERT 陳述式,或是使用多個參數來提交 UPDATE 或 INSERT 陳述式的部分,SQL Server 會將其建置成完整的陳述式。這部分的範例可以在本主題稍後的<範例>一節找到。 

範例

其他值參數的使用

如果是 UPDATE:

當使用單一參數時,可以使用下列語法來提交 UPDATE 陳述式:

[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,…n]

[!附註]

如果指定 UPDATE <資料表名稱>,為 table 參數指定的任何值都會被忽略。

當使用多個參數時,第一個參數必須是以下格式的字串:

[ SET ] <column name> = expression [,... n]

後續的參數必須是以下的格式:

<column name> = expression [,... n]

在此情況下,建構的 update 陳述式內的 <資料表名稱> 是 table 參數所指定或預設。

如果是 INSERT:

當使用單一參數時,可以使用下列語法來提交 INSERT 陳述式:

[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,... n] )

[!附註]

如果指定 INSERT <table name>,為 table 參數指定的任何值都會被忽略。

當使用多個參數時,第一個參數必須是以下格式的字串:

[ VALUES ( ] <expression> [,... n]

後續的參數必須是以下的格式:

expression [,... n]

除非在指定 VALUES 的情況下,此時最後一個運算式後面必須有尾端 ")"。 在此情況下,所建構之 UDPATE 陳述式中的 <table name> 是 table 參數所指定或預設的值。

[!附註]

可以將一個參數當做具名參數來提交,也就是 " @VALUES"。 在此情況下,無法使用其他具名參數。

請參閱

參考

sp_cursoropen (Transact-SQL)

sp_cursorfetch (Transact-SQL)

系統預存程序 (Transact-SQL)