在storedprocedure中使用類似程式的for迴圈用法

摘要:在storedprocedure中使用類似程式的for迴圈用法

 

在sql server 中我們可以利用storedprocedure來處理一連串執行sql語法的動作,而就不用在程式中處理,我所謂的程式指的是例如c#或vb.net這種

用程式再呼叫sql 指令,是很麻煩的

如果你同時要select 完再依結果集,逐筆insert再update再delete一連串的下指令,你程式中的cmd就要處理很幾次了,光是connection開關就很多次了吧

但如果用procedure來做的話,就可以在同一個procedure中同時做完這一連串的動作,且只有connection一次,節省很多的不必要的連線,速度也很快
因此把這種迴圈式的資料處理,放到資料庫裡做的話,你的應用程式執行的結果,效能會大大提昇哦..

使用fetch加上while就可以處理上述的問題,怎麼做呢?
小弟也在網路上找尋很多種資料,在實作後也覺得這樣的處理真的很方便,以後的debug,程式也不用再修改再建置,這樣耗時又耗工,直接在資料庫中測試及發佈,都是很快的。

 

可以參考微軟msdn網站上更詳細的說明,如果想要快速的使用這個方法的話,就請直接參考下面的寫法
http://msdn.microsoft.com/zh-tw/library/ms180169(SQL.90).aspx

--建立一個procedure
CREATE PROCEDURE sp_Test() 
as

--宣告三個變數,@colA及@colB分別為table中的欄位,@MyCursor為指標
DECLARE @colA nvarchar(10) 
DECLARE @colB nvarchar(10) 
DECLARE @MyCursor CURSOR

--指定啟用了效能最佳化的 FORWARD_ONLY、READ_ONLY 資料指標
SET @MyCursor = CURSOR FAST_FORWARD

--假設TableA中有100筆,則下列的語法就會直接傳回100筆
FOR 
Select colA,colB 
From tableA

--開啟指標
OPEN @MyCursor

--取得第一筆的值放到@colA及@colB
FETCH NEXT FROM @MyCursor 
INTO @ColA,@ColB

-- @@FETCH_STATUS=回針對連接目前開啟的任何資料指標而發出的最後一個資料指標 FETCH 陳述式的狀態
--傳回值
--  0  FETCH 陳述式成功。
-- -1 FETCH 陳述式失敗,或資料列已超出結果集。
-- -2 遺漏提取的資料列。

--開始繞迴圈
WHILE @@FETCH_STATUS = 0

BEGIN

--顯示@colA及@colB的值在畫面上
PRINT @ColA 
PRINT @ColB

--你也可以在這之中處理其他sql部份,例如你可以寫依據@colA及@colB這兩個key在tabl2查詢後的資料寫到table3
--這是其中一種應用
insert into table3
select * 
from table2
where table2.c1=@colA and table2.c2=@colB

--取得下一筆記錄的colA及colB
FETCH NEXT FROM @MyCursor 
INTO @ColA,@ColB

END

CLOSE @MyCursor 
DEALLOCATE @MyCursor 
GO