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


       變量

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

    declare @n int   --聲明變量關鍵字為declare 然后@加變量名 后面是變量類型

    declare @s varchar(36)

  2.局部變量的賦值

    set @s='f4'

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

    select @n=age from students  --如過變量通過select賦值,這里可能在表中查到很多age結果,這里只賦值查詢出來的最后一個age結果,如果set使用這種方法會出錯。

    set @n=(select age from Students where ID='1')--亦可以這樣給他賦值

 

全局變量

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

  常用的變量:

@@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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM