變數是Transact-SQL中由使用者定義、可對其賦值並參與運算的一個實體,分為全域性變數和區域性變數。其中全域性變數由系統自定義並維護,全域性變數名稱前面有@@字元,任何程式均可隨時呼叫。區域性變數名稱前面有一個@,由使用者定義和使用。
1 區域性變數
區域性變數一般出現在批處理、儲存過程和觸發器中,如果要使用區域性變數,必須在使用前以DECLARE語句定義。區域性變數僅存在於宣告它的批處理、儲存過程或觸發器中,處理結束後,儲存在區域性變數中的資訊將丟失。
1.1 區域性變數宣告
在使用DECLARE語句來宣告區域性變數時,必須提供變數名稱及資料型別,變數名稱前面必須有一個@字元,變數名稱最大長度為30個字元。宣告變數時可以使用任何系統定義的資料型別或使用者自定義的資料型別。
DECLARE語法:
DECLARE { @variable_name datatype | [= value]} [,...n]
引數:
◊ @variable_name:變數的名稱。變數名必須以@開頭。
◊ datatype:任何由系統提供的或使用者定義的資料型別。變數資料型別不能是text、ntext或image。
在SQL Server中,一次可以定義多個變數。
DECLARE @Name VARCHAR(50), @Age INT = 20
1.2 區域性變數賦值
變數宣告後,變數值被預設設定為NULL。可以使用SET或SELECT語句為變數賦值,SET是為變數賦值的首選方法。
語法格式:
SET @variable_name = expression
SELECT @variable_name = expression
示例:
DECLARE @Name VARCHAR(50), @Age INT SET @Name = 'Test' SELECT @Age = 20 SELECT @Name, @Age
DECLARE @TotalRecords INT SET @TotalRecords = (SELECT COUNT(1) FROM [dbo].[Product]) SELECT @TotalRecords = COUNT(1) FROM [dbo].[Product] SELECT @TotalRecords
在區域性變數沒有被賦值之前,其值是NULL,如果要引用,特別是在迴圈結構中引用,必須先為其賦值。
DECLARE @Counter INT SET @Counter = 1 WHILE @Counter <= 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 -- SELECT @Counter = @Counter + 1 END
在SELECT語句的WHERE字句中使用變數:
DECLARE @ProductID INT SET @ProductID = 1 SELECT * FROM [dbo].[Product] WHERE [ProductID] = @ProductID
變數可以通過選擇列表中當前所引用的值賦值,如果在選擇列中引用變數,變數應被賦以標量值或者SELECT語句應僅返回一行。
DECLARE @MaxQuantity INT SET @MaxQuantity = (SELECT MAX([Quantity]) FROM [dbo].[Product]) SELECT @MaxQuantity
DECLARE @MaxQuantity INT SELECT @MaxQuantity = MAX([Quantity]) FROM [dbo].[Product] SELECT @MaxQuantity
如果SELECT語句返回多行而且變數引用一個非標量表示式,則變數被賦予為結果集最後一行中表示式的返回值。
DECLARE @ProductID INT SELECT @ProductID = [ProductID] FROM [dbo].[Product] SELECT @ProductID
測試[dbo].[Product]表中有5條記錄,執行結果為:5
DECLARE @ProductIDs VARCHAR(100) SET @ProductIDs = '' SELECT @ProductIDs += CONVERT(VARCHAR,[ProductID]) + ',' FROM [dbo].[Product] SELECT @ProductIDs
執行結果為:1,2,3,4,5,
1.3 Table型別變數
Table型別的變數可以作為儲存資料的臨時表。
DECLARE @MyProduct TABLE ( ProductID INT, ProductName VARCHAR(100) ); INSERT INTO @MyProduct SELECT [ProductID], [ProductName] FROM [dbo].[Product] WHERE [UnitPrict] >= 10; SELECT * FROM @MyProduct;
2 全域性變數
全域性變數用來跟蹤伺服器範圍和特定會話期間的資訊,不能顯式被賦值。全域性變數不能由使用者定義。