1. 程式人生 > >SqlServer中檢視、儲存過程、事務的使用。

SqlServer中檢視、儲存過程、事務的使用。

前言

熟悉SqlServer中檢視、儲存過程、事務的使用會在操作資料時帶來更大的方便。

正文

檢視-VIEW

VIEW介紹

  1. 定義:
    檢視(VIEW)虛擬表,一般是不儲存資料的,但是Sqlserver的索引檢視例外(儲存資料),以下不考慮索引檢視。
    是對查詢的Sql語句的封裝,只是預定義了一段sql語句,不會提高查詢效率
  2. 優點或用途:
    降低查詢複雜度:可以把很長的sql語句用一個viewName代替。
    許可權控制:防止未經許可使用者訪問敏感資料。比如普通使用者只有檢視資料的權利,這時候就可以讓使用者只調用檢視。這樣當用戶賬號被獲取也不會對敏感資料造成影響。
  3. 系統檢視
    系統預定義的檢視
    這裡寫圖片描述

VIEW使用

  • 建立檢視
--vw_ShowsTable是檢視的名字
--as後面是你封裝的sql語句
create View vw_ShowsTable
as
select * from Shows where id>2

然後在資料庫下的檢視資料夾裡出現你剛才建立的檢視了
這裡寫圖片描述

  • 使用檢視

直接像表一樣呼叫就行了。

select * from vw_ShowsTable

這裡的view封裝的sql語句很短並沒體現優點,當sql語句很長時再通過view呼叫sql語句就會發現世界如此簡單。

儲存過程-SP

介紹

  1. 定義:
    儲存過程(Stored Procedure)相當於C#中的函式,通過SP的name呼叫,可以有引數和返回結果。
  2. 優點或用途:
    • 經過編譯-執行速度快
    • 可以重複使用
    • 提高安全性
    • 使用簡單
      當壓力比較大,可以把一部分壓力放在資料庫。但是以後修改起來比較麻煩。
  3. 系統SP
    以sp_開頭,用來進行系統的各項設定.取得資訊.相關管理工作。
    這裡寫圖片描述

使用

  • 建立SP
--usp_select_Shows是儲存過程名稱,後面可以跟引數
--begin end裡是你的sql語句
create proc usp_select_Shows
@n1 int
as
begin
select * from Shows where id>@n1
end
  • 使用SP
--exec呼叫儲存過程,有引數的話在spName後面+空格+引數
exec usp_select_Shows 2

事務-Transaction

Transaction介紹

  1. 定義
    事務(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。
  2. 優點或用途
    正常sql出錯的執行順序:
    開始執行-前幾條執行完成-出錯停止執行-後面幾條不執行。
    但是有時候有其它需求:

    • 開始執行-出現錯誤-全部sql回滾,資料恢復到全部未執行狀態。
    • 開始執行-出現錯誤-忽略出錯的sql繼續執行接下來的slq。

第一種是常用場合是轉賬。事務就能幫我們做到這兩種情況。

事務種類

自動事務:其實執行的普通sql語句都是一個事務,比如插入資料的sql出錯會恢復到未插入狀態,這就是自動事務的功勞。
隱式事務:
顯式事務:顯式事務是常用的事務,需要手動開啟事務,接下來講如何使用顯式事務。

使用顯式事務

出錯全部回滾:

begin tran  -- 開始一個事務
declare @tran_error int  --宣告一個變數用於檢測sql是否出錯

begin try -- try catch結構來檢測是否出錯,
 -- 你的sql語句
end try
begin catch
    set @[email protected]_error+1 --檢測到你的錯誤後變數加1
end catch

if (@tran_error > 0) 
    rollback tran  -- 變數值改變就回滾
else 
    commit tran  -- 變數值不變就提交

出錯後忽略錯誤語句繼續執行接下來的sql:
這種情況是需要設定xact_abort(精確終止),設定為on時出錯全部回滾(可代替上面的try-catch寫法),為off時出錯繼續執行下面sql。

 -- 精確終止關閉
set xact_abort off;
begin tran
insert into sorce values  (1,60)
insert into sorce values  (2,"aa")
insert into sorce values  (3,90)
commit tran 

第二條sql因為資料型別錯誤會失敗,這種情況下,出錯後會忽略錯誤語句繼續執行下面的sql,第一第三句sql執行成功,第二句忽略。

請注意,不論提交或回滾,都代表當前事務結束,沒有end tran這個命令

當然還有其他的寫法不過大同小異,比如可以宣告事務的名稱、提交回滾都帶上事務的名稱。我覺得如果不是巢狀事務,沒必要宣告事務名稱