首頁 > 軟體

SQL Server在T-SQL語句中使用變數

2022-05-21 16:00:12

變數的種類

在T-SQL中,變數按生存範圍可以分為全域性變數(Global Variable)和區域性變數(Local Variable)

  • 全域性變數是由系統定義的,在整個SQL Server範例內都能存取到的變數,全部變數以@@開頭,使用者只能存取,不能賦值。
  • 區域性變數由使用者定義,生命週期只在一個批次處理內有效。區域性變數以@作為第一個字元,由使用者自己定義和複製。

範例:

DECLARE @i int    --宣告一個int型別區域性變數
  SET @i = 10      --通過SET對區域性變數進行賦值

  DECLARE @Name nvarchar(20)    --宣告一個nvarchar(20)型別變數
  SET @Name = '張飛'

  PRINT @@VERSION     --全部變數,只能讀取,不能賦值
  SET @@VERSION = '123'    --此行程式碼報錯

全域性變數

全域性變數的用途

  • 全域性變數是SQL Server系統內部使用的變數,其作用範圍並不僅僅侷限於某一程式,而是任何程式均可以隨時呼叫。
  • 全域性變數通常儲存一些SQL Server的設定設定值和統計資料。使用者可以在程式中用全域性變數來測試系統的設定值或者是Transact-SQL命令執行後的狀態值。

全域性變數列表

select @@CONNECTIONS; --返回自上次SQL啟動以來連線或試圖連線的次數。
select @@CPU_BUSY / 100; --返回自上次啟動SQL 以來 CPU 的工作時間,單位為毫秒
select @@CURSOR_ROWS as w; --返回被開啟的遊標中還未被讀取的有效資料行的行數
select @@DATEFIRST as w; --返回使用SET DATEFIRST 命令而被賦值的DATAFIRST ,用來指定每週的第一天是星期幾
select @@FETCH_STATUS as w; --返回上一次FETCH 語句的狀態值(0:成功,-1失敗或行超過結果集,-2行沒找到)
select @@DBTS as w; --為當前資料庫返回當前 timestamp 資料型別的值。這一 timestamp 值保證在資料庫中是唯一的。
select @@ERROR; --返回最後執行的 Transact-SQL 語句的錯誤程式碼(integer) (0,表示沒錯誤;1,表示有錯誤)
select @@IDENTITY as w; --返回最後插入的標識值
select @@IDLE as w; --返回SQL自上次啟動後閒置的時間,單位為毫秒
select @@IO_BUSY as w; --返回SQL自上次啟動後用於執行輸入和輸出操作的時間,單位為毫秒
select @@LANGID as w; --返回當前所使用語言的本地語言識別符號(ID)。
select @@LANGUAGE as w; --返回當前使用的語言名
select @@LOCK_TIMEOUT as w; --當前對談的當前鎖超時設定,單位為毫秒。
select @@MAX_CONNECTIONS as w; --返回SQL上允許的同時使用者連線的最大數。返回的數不必為當前設定的數值
select @@MAX_PRECISION as w; --返回 decimal 和 numeric 資料型別所用的精度級別,即該伺服器中當前設定的精度。預設最大精度38。
select @@OPTIONS as w; --返回當前 SET 選項的資訊。
select @@PACK_RECEIVED as w; --返回SQL自啟動後從網路上讀取的輸入封包數目。
select @@PACK_SENT as w; --返回SQ自上次啟動後寫到網路上的輸出封包數目。
select @@PACKET_ERRORS as w; --返回自SQL啟動後,在SQL連線上發生的網路封包錯誤數。
select @@ROWCOUNT as w; --返回上一次語句影響的資料行的行數
select @@SERVERNAME as w; --返回執行SQL伺服器名稱。
select @@SERVICENAME as w; --返回SQL正在其下執行的登入檔鍵名
select @@TIMETICKS as w; --返回SQL伺服器一刻度的微秒數
select @@TOTAL_ERRORS as w; --返回 SQL伺服器自啟動後,所遇到的磁碟讀/寫錯誤數。
select @@TOTAL_READ as w; --返回 SQL伺服器自啟動後讀取磁碟的次數。
select @@TOTAL_WRITE as w; --返回SQL伺服器自啟動後寫入磁碟的次數。
select @@TRANCOUNT as w; --返回當前連線的活動事務數。
select @@VERSION as w; --返回當前安裝的SQL Server 的日期版本處理器

區域性變數

區域性變數的用途

  • 在迴圈中記錄迴圈次數
  • 儲儲存存過程或者函數的返回值

區域性變數的宣告

區域性變數的宣告必須以"DECLARE"作為關鍵字,變數的命名必須以"@"作為變數名的第一個字元,必須為所宣告的變數提供一個資料型別和資料長度。
如:

DECLARE @Name nvarchar(20)

注意:區域性變數的資料型別不能為Text,ntext,和Image型別,當對於字元型變數只提供資料型別沒有提供資料長度時,資料長度預設為1.

設定變數中的值(賦值)

有兩種設定變數值方法。可以使用SELECE語句或者SET語句。從功能上看,它們的作用幾乎是相同的,不同的是SELECT語句允許後設資料值來自SELECT語句中的某一列。

1、使用SET設定變數

DECLARE @i int,@j int
  set @i = 10;
  set @j = 20;
  select @i + @j

用查詢到的值設定變數:

DECLARE @i int
  SET @i = (select MAX(Age) from Person)  --當使用SET時如果返回結果有多行也會報錯。同時如果返回多條記錄也報錯
  SELECT @i

2、使用SELECT設定變數:

當變數中儲存的資訊來源於查詢時,經常使用SELECT給變數賦值,語法比較簡便。

DECLARE @i int
  SELECT @i = 100
  SELECT @i

查詢的資訊為變數賦值:

DECLARE @i int
   SELECT @i = Age from Person_1 order by Id desc    --當返回多個值時用最後一個賦值
   PRINT @i

SELECT同時設定多個值:

DECLARE @Name varchar(20)
  DECLARE @i int
  SELECT @i = 10, @Name = '張飛'

3、當表示式未返回值時

  • 使用SET對區域性變數賦值時,如果賦值表示式未返回值,則區域性變數變為NULL;而SELECT對錶示式賦值時,如果表示式未返回值,則區域性變數保持原值。
  • 一切只宣告沒有賦值的區域性變數的初始值都為”NULL”。

例如:

DECLARE @Name nvarchar(50) 
  SET @Name = '黃飛鴻'
  select @Name = Name from Person_1 where Id = 100    --100不存在記錄,此處如果改為一個Id存在的,且Name列不為null的值,則@Name變數的值就變了
  PRINT @Name  --依然列印的是黃飛鴻

可見,當SELECT表示式賦值時,如果為返回值,則保持原值。

區域性表變數

區域性表變數是一個特殊的區域性變數。和臨時表不同,區域性表變數具有一切區域性變數的特點。在查詢中,因為區域性表變數是存在記憶體中,而不是硬碟中,所以速度會遠遠快於臨時表或是實際表。區域性表變數最多的使用是在查詢中充當多個表做連線時的中間表

DECLARE @TempTable TABLE    --宣告一個區域性表變數
(
    Id int,
    Name nvarchar(50)
)
INSERT INTO @TempTable     --用查詢到的作為資料插入到區域性表變數
SELECT Id,Name FROM Person_1

SELECT * FROM @TempTable    --和普通表一樣用,可以各種join,子查詢等等。

到此這篇關於SQL Server在T-SQL語句中使用變數的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com