[筆記][SQL]Cursor語法

  • 382
  • 0
  • 2016-11-02

筆記簡單的使用Cursor

以前學SQL指令的時候,被告誡盡量少用Cursor,因為會有效能問題。所以,一直都沒使用Cursor。這幾年下來,不用Cursor也可以活得好好的。不過,雖然自己不使用Cursor,但總還是會維護到有使用Cursor的Stored Procedure。之前問題沒有出在有Cursor的Statement上,所以不碰Cursor語法沒關係。但最近一次的問題,總算是需要去修改Cursor相關的程式碼。所以只好認份的瞭解Cursor的語法了。

網路上查了一下,Cursor之所以會有效能的Issue,主要是因為會產生較多的TDS封包,以及可能會因為資料過大,而讓TempDB暴增(參考:RiCo技術農場-盡量避免使用Cursor)。所以使用時,要小心。

寫一個簡單的Lab來學習Cursor的語法。建立測試用Table及資料:首先建立一個暫時性的Table,作為Lab的資料來源。

CREATE TABLE #Orders
(
    OrderUID INT NOT NULL IDENTITY,
    Customer NVARCHAR( 100),
    Item NVARCHAR( 200),
    Quantity INT NOT NULL
)

INSERT INTO #Orders(Customer, Item, Quantity)
VALUES ('Foo', N'可樂', 10)

INSERT INTO #Orders(Customer, Item, Quantity)
VALUES ('Boo', N'餅乾', 20)

INSERT INTO #Orders(Customer, Item, Quantity)
VALUES ('Boo', N'甜甜圈', 30)

使用Cursor以PRINT出某一個欄位資料

--宣告Cursor,及其對應的資料集
DECLARE cursorObj Cursor FOR 
SELECT Customer, Item, Quantity FROM #Orders

--開啟Cursor
Open cursorObj

--定義用來承接資料集的變數
DECLARE @Customer nvarchar( 100), @Item nvarchar( 200),@Quantity int 

FETCH NEXT FROM cursorObj INTO @Customer, @Item, @Quantity
While (@@FETCH_STATUS <> -1)
BEGIN  --開始迴圈

--處理商業邏輯的區塊
PRINT @Customer + @Item

FETCH NEXT FROM cursorObj INTO @Customer, @Item, @Quantity

END --結束迴圈

--關閉&釋放Cursor
CLOSE cursorObj
DEALLOCATE cursorObj

參考