一、游標概念: 將某一結果集作為一個集合處理,且每次處理數據集的一行或一行的某些字段。
建立游標結構如下:
1. 定義游標,將游標與Transact-SQL語句的結果集相關聯。
Declare @bookid int, @bname varchar(50),@bindex int
Declare book_cursor cursor for
Select bookid,bookname,bookIndex from Bas_bookList
2. 執行Transact-SQL語句數據集填充游標即打開游標
Open book_cursor
3. 從游標中檢索到第一行,並提取第一行或第一行的某些字段。
Fetch next from book_cursor into @bookid,@bname,@bindex
4. 根據需要對當前行進行操作
@@Fetch_status包括三種狀態 0,-1,-2。以此來判斷游標執行是否正確。
0則游標執行正確,-1 游標中出現錯誤,-2 找到空行
While @@fetch_status=0
Begin
Delete update insert 等等
Fetch next from book_cursor into @bookid,@bname,@bindex 選取下一行數據
End
4. 關閉游標
Close book_cursor
Deallocate book_cursor
說明: 客戶端游標,被odbc所支持,在使用時會有一些限制,只能使用只進和靜態游標,它是把結果緩存到客戶端,所有游標的操作都由客戶端高速緩存下來。並不在服務器端執行,一般情況下都不這樣使用, 只是對一些服務端不支持的Transact-sql和批處理才使用。
這小段只是我對客戶端游標的理解,僅作參考。
二、事務,用起來很簡單這裡就不在詳細介紹了。
1. 在存儲過程中使用事務
語句結構:
事務起始點: Begin transaction
提交事務,完成自事務起始點開始的數據操作變化,釋放事務所占用的資源:Commit TranSaction
如果事務出現錯誤,回滾:Rollback
在事務起始點,begin transaction tran1 使@@TRANCOUNT 按 1 遞增
執行事務,commit ttansaction tran1 使@@TRANCOUNT 按1 遞減,直到減少到0
回滾是到事務的起點或事務的某個保存點也就是定義點。
2. 在C#程序中也可以使用事務
Using(System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClIEnt.SqlConnection(“數據庫連接字符串”))
{
conn.open();
using (System.Data.SqlClIEnt.SqlTransaction trans=conn.BeginTransaction())
{
Try
{
sql語句 ;
Trans.Commit();
}
Catch
{
Trans.Rollback();
}
}
}
三、Transact-SQL實現類似於C#語言中的異常處理。Transact-SQL語句組可以包含在TRY塊中,如果TRY塊內部發生錯誤,則會將事件處理轉到Catch塊中。
語句結構
BEGIN TRY
Transact-SQL語句
END TRY
BEGIN CATCH
錯誤處理機制
END CATCH
其實以上講述的基礎知識。剛開始從事開發工作就知道明白,會用了。
此文只是系統地總結一下。供大家參考。算不上精辟。
我在實際的應用中發現一個問題,對於一個復雜的存儲過程,把上面三種用法綜合到一起,會提高不少的執行效率。一是為了找到錯誤點,回滾事務,把 try和 transaction組合到一起,如果大量數據要處理,可能會用到游標,有時候在想,事務當執行commit的時候才會永久地處理數據,是不是在用游標的時候也這樣,把游標寫到事務裡,把所有的游標都執行完畢,再進行事務處理,如果異常則回滾。試了一下,果然快很多。而且在Transact-Sql裡同一存儲過程定義的變量,在整個運行周期都是有效的,這就很好將整個構想實現了。例如:
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION tran1
DECLARE @proarageid BIGINT,@procomid BIGINT,@proagentid BIGINT,@progropid BIGINT
---語句
DECLARE acursor CURSOR
FOR SELECT id,provicename,cityname FROM Ass_ArrearageTemporary
OPEN acursor
FETCH NEXT FROM acursor INTO @proarageid,@procomid,@proagentid WHILE @@FETCH_STATUS = 0
BEGIN
---語句
FETCH NEXT FROM acursor INTO @proarageid,@procomid,@proagentid
END
COMMIT TRANSACTION tran1
CLOSE acursor
DEALLOCATE acursor
END TRY
begin CATCH
IF @@TRANCOUNT > 0
BEGIN
CLOSE acursor
DEALLOCATE acursor
ROLLBACK TRANSACTION tran1
return
END
END CATCH
雖不是含量很高,但也是筆者的心血。