摘要:在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