SQL知識整理三:變量、全局變量、視圖、事務、異常

       變量數據庫

  1.局部變量的聲明(一個@)安全

    declare @n int   --聲明變量關鍵字爲declare 而後@加變量名 後面是變量類型服務器

    declare @s varchar(36)網絡

  2.局部變量的賦值數據結構

    set @s='f4'函數

    set @n=@n+1  --變量的賦值有兩種方法,一種是經過set,一種是select 若是變量不附初始值則默認爲null,null參與計算的結果仍是null,這一行的@n就等於nullspa

    select @n=age from students  --如過變量經過select賦值,這裏可能在表中查到不少age結果,這裏只賦值查詢出來的最後一個age結果,若是set使用這種方法會出錯。code

    set @n=(select age from Students where ID='1')--亦能夠這樣給他賦值對象

 

全局變量blog

  全局變量:是系統預約義的,返回一些系統信息,全局變量以兩個@@開頭。

  經常使用的變量:

@@CONNECTIONS 返回自上次啓動以來鏈接或試圖鏈接的次數。

@@CURSOR_ROWS 返回鏈接上最後打開的遊標中當前存在的合格行的數量(返回被打開的遊標中還未被讀取的有效數據行的行數)

@@DATEFIRST 返回每週第一天的數字

@@ERROR 返回最後執行的SQL 語句的錯誤代碼。

@@FETCH_STATUS 返回被 FETCH 語句執行的最後遊標的狀態,而不是任何當前被鏈接打開的遊標的狀態。

@@IDENTITY 返回最後插入的標識值

@@LANGID 返回當前所使用語言的本地語言標識符(ID)。

@@LANGUAGE 返回當前使用的語言名。

@@LOCK_TIMEOUT 返回當前會話的當前鎖超時設置,單位爲毫秒。

@@PROCID 返回當前過程的存儲過程標識符 (ID) 。

@@ROWCOUNT 返回受上一語句影響的行數。

@@SERVERNAME 返回運行 的本地服務器名稱。

@@SPID 返回當前用戶進程的服務器進程標識符 (ID)。

@@TRANCOUNT 返回當前鏈接的活動事務數。

@@VERSION 返回當前安裝的日期、版本和處理器類型。

@@CPU_BUSY 返回自SQL Server 最近一次啓動以來CPU 的工做時間其單位爲毫秒

@@DATEFIRST 返回使用SET DATEFIRST 命令而被賦值的DATAFIRST 參數值SET DATEFIRST,命令用來指定每週的第一天是星期幾

@@DBTS 返回當前數據庫的時間戳值必須保證數據庫中時間戳的值是唯一的

@@ERROR 返回執行Transact-SQL 語句的錯誤代碼

@@FETCH_STATUS 返回上一次FETCH 語句的狀態值

@@IDLE 返回自SQL Server 最近一次啓動以來CPU 處於空閉狀態的時間長短單位爲毫秒

@@IO_BUSY 返回自SQL Server 最近一次啓動以來CPU 執行輸入輸出操做所花費的時間其單位爲毫秒

@@LANGID 返回當前所使用的語言ID 值

@@LANGUAGE 返回當前使用的語言名稱

@@LOCK_TIMEOUT 返回當前會話等待鎖的時間長短其單位爲毫秒

@@MAX_CONNECTIONS 返回容許鏈接到SQL Server 的最大鏈接數目

@@MAX_PRECISION 返回decimal 和numeric 數據類型的精確度

@@NESTLEVEL 返回當前執行的存儲過程的嵌套級數初始值爲0

@@OPTIONS 返回當前SET 選項的信息

@@PACK_RECEIVED 返回SQL Server 經過網絡讀取的輸入包的數目

@@PACK_SENT 返回SQL Server 寫給網絡的輸出包的數目

@@PACKET_ERRORS 返回網絡包的錯誤數目

@@PROCID 返回當前存儲過程的ID 值

@@REMSERVER 返回遠程SQL Server 數據庫服務器的名稱

@@SERVICENAME 返回SQL Server 正運行於哪一種服務狀態之下如MSSQLServer MSDTC SQLServerAgent

@@SPID 返回當前用戶處理的服務器處理ID 值

@@TEXTSIZE 返回SET 語句的TEXTSIZE 選項值SET 語句定義了SELECT 語句中text 或image數據類型的最大長度基本單位爲字節

@@TIMETICKS 返回每一時鐘的微秒數

@@TOTAL_ERRORS 返回磁盤讀寫錯誤數目

@@TOTAL_READ 返回磁盤讀操做的數目

@@TOTAL_WRITE 返回磁盤寫操做的數目

@@TRANCOUNT 返回當前鏈接中處於激活狀態的事務數

視圖

  1.視圖是一張虛擬表,他所存儲的不是實際數據,而是查詢語句,但咱們能夠對視圖進行像數據表同樣的操做。

  2.爲何使用視圖呢?個人理解是:1.在遠程傳輸數據時,能夠避免過長的查詢字符,減小流量。2.他能夠簡化繁雜的多表嵌套查詢語句。3.安全性,防止非法用戶訪問敏感數據,由於咱們能夠經過建立視圖展現給用戶,咱們想要給他們查看的數據。

  3.視圖的建立

    create view vw_city

    as

    select cityName from city   --這個查詢語句能夠隨便的寫,若是是些多層次的嵌套查詢語句的話,那麼下面使用視圖的簡易性就突出了。應爲只用一句簡短的查詢語句就能把本來繁雜的搞定

  4.視圖的查詢

    select * from vw_city

  5.因爲視圖是以查詢語句的形式存儲的,因此通常視圖只用於查看數據,通常不對視圖進行增刪改。若是數據庫中的表數據改變那麼視圖中的數據也會隨之改變,由於視圖就至關於查詢語句

 

事務

  事務定義:

         事務有若干條T-SQL指令組成,而且全部的指令昨晚一個總體提交給數據庫系統,執行時,這組指令要麼所有執行完成,要麼所有取消。所以,事務是一個不可分割的邏輯單元。

 

  事務的特色:

         事務有4個屬性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)以及持久性(Durability),也稱做事務的ACID屬性。

         原子性:事務內的全部工做要麼所有完成,要麼所有不完成,不存在只有一部分完成的狀況。

         一致性:事務內的而後操做都不能違反數據庫的而後約束或規則,事務完成時有內部數據結構都必須是正確的。

         隔離性:事務直接是相互隔離的,若是有兩個事務對同一個數據庫進行操做,好比讀取表數據。任何一個事務看到的全部內容要麼是其餘事務完成以前的狀態,要麼是其餘事務完成以後的狀態。一個事務不可能遇到另外一個事務的中間狀態。

         持久性:事務完成以後,它對數據庫系統的影響是持久的,即便是系統錯誤,從新啓動系統後,該事務的結果依然存在。

 

  事務的模式:

         顯示事務:是用戶使用T-SQL明確的定義事務的開始(begin transaction)和提交(commit transaction)或回滾事務(rollback transaction)

         自動提交事務:是一種可以自動執行並能自動回滾事務,這種方式是T-SQL的默認事務方式。例如在刪除一個表記錄的時候,若是這條記錄有主外鍵關係的時候,刪除就會受主外鍵約束的影響,那麼這個刪除就會取消。

    能夠設置事務進入隱式方式:set implicit_transaction on;

         隱式事務:是指當事務提交或回滾後,SQL Server自動開始事務。所以,隱式事務不須要使用begin transaction顯示開始,只需直接失業提交事務或回滾事務的T-SQL語句便可。

    使用時,須要設置set implicit_transaction on語句,將隱式事務模式打開,下一個語句會啓動一個新的事物,再下一個語句又將啓動一個新事務。

 

  事務的示例:

begin tran

    select * from student where  sname=@name and sage=@age

    if @@ERROR<>0

       begin

           rollback tran

           insert into student(studentid,sname,sage) values (1,@name,@age)

           return 0

       end

    else

       begin

       commit tran

       select * from student

       end

go

 

異常

  錯誤函數:

  TRY...CATCH 使用錯誤函數來捕獲錯誤信息。       ERROR_NUMBER() 返回錯誤號。       ERROR_MESSAGE() 返回錯誤消息的完整文本。此文本包括爲任何可替換參數(如長度、對象名稱或時間)提供的值。       ERROR_SEVERITY() 返回錯誤嚴重性。       ERROR_STATE() 返回錯誤狀態號。       ERROR_LINE() 返回致使錯誤的例程中的行號。       ERROR_PROCEDURE() 返回出現錯誤的存儲過程或觸發器的名稱。

 

  異常示例:

begin try
    select 1 / 0;
end try
begin catch
    exec proc_error_info; --調用錯誤消息存儲過程
end catch
go
相關文章
相關標籤/搜索