摘要:Cursor
之前在碰Oracle時,也有撰寫過Store Procedure,但是Oracle有一個比較特別的地方是,他有Package的功能,什麼是Package呢,Package就是可以包含很多Store Procedure,如我們撰寫
Create or replace package tPakcage
…..
Procedure tProc1(
)
Procedure tProc2(
)
End tPakcage;
…..
Procedure tProc1(
)
Procedure tProc2(
)
End tPakcage;
然後在每個Procedure可以輕鬆的呼叫對方,不過我這邊要講的不是Package的好用,而是在講我在撰寫Oracle時,有用到Cursor(迴圈),因此我想SQL SERVER應該本身也有提供。
在找了一些文件後,開始來試著撰寫Store Procedure的Cursor
CREATE PROCEDURE dbo.ttt @tname nvarchar(100)
AS
DECLARE MyCur CURSOR FOR
SELECT * FROM f_split(@tname, ',') AS t
OPEN MyCur
DECLARE @uname nvarchar(100)
FETCH Next FROM myCur INTO @uname
WHILE (@@Fetch_Status = 0)
BEGIN
INSERT INTO testTable (name) values (@uname )
FETCH NEXT FROM myCur INTO @uname
END
CLOSE MyCur
DEALLOCATE MyCur
GO
AS
DECLARE MyCur CURSOR FOR
SELECT * FROM f_split(@tname, ',') AS t
OPEN MyCur
DECLARE @uname nvarchar(100)
FETCH Next FROM myCur INTO @uname
WHILE (@@Fetch_Status = 0)
BEGIN
INSERT INTO testTable (name) values (@uname )
FETCH NEXT FROM myCur INTO @uname
END
CLOSE MyCur
DEALLOCATE MyCur
GO
當然在撰寫時,我們必須要Create Procedure,緊接著我們要宣告變數為Cursor,那他要跑哪一段sql字句的資料呢?,就利用For這個關鍵字。
接著我們要將cursor打開,之後我們要撰寫for-loop了,在SQL SERVER我們是利用FETCH NEXT的方式來跑遞迴,因為我們的sql字句
SELECT * FROM f_split(@tname, ',') AS t
只會select出一個欄位,所以在這邊我只宣告一個@uname的變數去接他,如果這邊我select2、3個欄位以上,那如果你想接值的話,就必須相對應的宣告變數去接值,接著我判斷@@Fetch_Status的狀態是不是正常的
傳回值 | 描述 |
0 | FETCH 陳述式成功。 |
-1 | FETCH 陳述式失敗,或資料列已超出結果集。 |
-2 | 遺漏提取的資料列。 |
如果是正常的話,接下來我們就可以執行我們欲做的事了,接著我們再
FETCH NEXT FROM myCur INTO @uname
讓他跑下一筆,一直遞迴下去。
最後我們執行完後,我們必須關閉我們宣告的Cursor,然後讓記憶體重新分配。
上述提供的程式與操作,僅供大家參考。