筆記簡單的使用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