之前在碰Oracle時,也有撰寫過Store Procedure,但是Oracle有一個比較特別的地方是,他有Package的功能,什麼是Package呢,Package就是可以包含很多Store Procedure,如我們撰寫
Create or replace package tPakcage
        …..
Procedure tProc1(
  
)
Procedure tProc2(
)
  
End tPakcage;
 
然後在每個Procedure可以輕鬆的呼叫對方,不過我這邊要講的不是Package的好用,而是在講我在撰寫Oracle時,有用到Cursor(迴圈),因此我想SQL SERVER應該本身也有提供。
 
在找了一些文件後,開始來試著撰寫Store ProcedureCursor
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
 
當然在撰寫時,我們必須要Create Procedure,緊接著我們要宣告變數為Cursor,那他要跑哪一段sql字句的資料呢?,就利用For這個關鍵字。
接著我們要將cursor打開,之後我們要撰寫for-loop了,在SQL SERVER我們是利用FETCH NEXT的方式來跑遞迴,因為我們的sql字句
SELECT * FROM f_split(@tname, ',') AS t
只會select出一個欄位,所以在這邊我只宣告一個@uname的變數去接他,如果這邊我select23個欄位以上,那如果你想接值的話,就必須相對應的宣告變數去接值,接著我判斷@@Fetch_Status的狀態是不是正常的

 

傳回值
描述
0
FETCH 陳述式成功。
-1
FETCH 陳述式失敗,或資料列已超出結果集。
-2
遺漏提取的資料列。
如果是正常的話,接下來我們就可以執行我們欲做的事了,接著我們再
FETCH NEXT FROM myCur INTO @uname
讓他跑下一筆,一直遞迴下去。
 
最後我們執行完後,我們必須關閉我們宣告的Cursor,然後讓記憶體重新分配。
 
上述提供的程式與操作,僅供大家參考。