分享方式:


變數 (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲

Transact-SQL 區域變數是一種物件,可保存特定類型的單一資料值。 批次和指令碼中的變數通常的用途為:

  • 做為計數器,可計算執行循環的次數,或控制執行循環的次數。
  • 容納由流程控制陳述式測試的資料值。
  • 若要儲存預存程序傳回碼或函數傳回值所傳回的資料值。

備註

某些 Transact-SQL 系統函式的名稱以兩 個符號@@) 開頭。 雖然在舊版的 SQL Server 中,函 @@ 式稱為全域變數、 @@ 函式不是變數,而且它們的行為與變數不同。 函式 @@ 是系統函式,其語法使用方式遵循函式的規則。

您不能在檢視中使用變數。

對變數所做變更不會受到交易回復的影響。

宣告 Transact-SQL 變數

語句 DECLARE 會透過下列方式初始化 Transact-SQL 變數:

  • 指派名稱。 名稱必須具有單 @ 一做為第一個字元。

  • 指派系統提供或使用者自訂的資料類型和長度。 若是數值變數,也會指派有效位數和小數位數。 針對 XML 類型的變數,可能會指派選擇性的架構集合。

  • 將值設定為 NULL

例如,下列DECLARE語句會建立名為 @mycounter 且具有 int 數據類型的局部變數。 根據預設,這個變數的值是 NULL

DECLARE @MyCounter INT;

若要宣告一個以上的本機變數,請在第一個定義的本機變數後加上逗號,再指定下一個本機變數名稱與資料類型。

例如,下列 DECLARE 語句會建立三個名為 @LastName@FirstName@StateProvince的局部變數,並將每個變數初始化為 NULL

DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);

在另一個範例中,下列 DECLARE 語句會建立名為 @IsActive的布爾變數,其宣告為 bit 且值為 0false):

DECLARE @IsActive BIT = 0;

變數範圍

變數的範圍是可以參考變數的 Transact-SQL 陳述式範圍。 變數的範圍會從宣告的點持續到宣告的批次或預存程式的結尾為止。 例如,下列腳本會產生語法錯誤,因為變數會在一個批次中宣告(以 GO 關鍵詞分隔),並在另一個批次中參考:

USE AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

SELECT BusinessEntityID,
    NationalIDNumber,
    JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

變數具有區域範圍,而且只能在定義變數的批次或程序中顯示。 在下列範例中,為了執行 sp_executesql 而建立的巢狀範圍無法存取較高範圍中宣告的變數,並傳回和 錯誤。

DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error

在 Transact-SQL 變數中設定值

第一次宣告變數時,其值會設定為 NULL。 若要將值指派給變數,請使用 SET 語句。 這是將值指派給變數所慣用的方法。 變數也可以藉由在語句的 SELECT 選取清單中參考來指派值。

若要使用 SET 陳述式指派值給變數,請加入變數名稱和值以指派給變數。 這是將值指派給變數所慣用的方法。 例如,下列批次會宣告兩個變數、指派值給變數,然後在 WHERE 陳述式的 SELECT 子句中使用這些變數:

USE AdventureWorks2022;
GO

-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
    @PostalCodeVariable NVARCHAR(15);

-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';

-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName,
    FirstName,
    JobTitle,
    City,
    StateProvinceName,
    CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
    OR PostalCode = @PostalCodeVariable;
GO

您也可以建立參考變數的選取清單,將值指派給變數。 如果在選取清單中參考變數,則應該指派純量值,否則 SELECT 語句應該只傳回一個數據列。 例如:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = MAX(EmployeeID)
FROM HumanResources.Employee;
GO

警告

如果在單 SELECT 一語句中有多個指派子句,SQL Server 並不保證表達式的評估順序。 只有在指派之間有參考時,才會顯示效果。

SELECT如果語句傳回一個以上的數據列,而變數參考非calar 運算式,變數就會設定為結果集最後一個數據列中表達式所傳回的值。 例如,在下列批次 @EmpIDVariable 中,會設定為 BusinessEntityID 所傳回最後一個數據列的值,也就是 1

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;

SELECT @EmpIDVariable;
GO

範例

以下指令碼建立一個小型測試資料表,並於其中填入 26 個資料列。 指令碼將使用變數進行三個用途:

  • 藉由控制迴圈執行次數,來控制插入的資料列數。
  • 提供插入整數資料行的數值。
  • 當作運算式的一部份,用來產生插入字元資料行的文字。
-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO

SET NOCOUNT ON;
GO

-- Declare the variable to be used.
DECLARE @MyCounter INT;

-- Initialize the variable.
SET @MyCounter = 0;

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
    -- Insert a row into the table.
    INSERT INTO TestTable
    VALUES
        -- Use the variable to provide the integer value
        -- for cola. Also use it to generate a unique letter
        -- for each row. Use the ASCII function to get the
        -- integer value of 'a'. Add @MyCounter. Use CHAR to
        -- convert the sum back to the character @MyCounter
        -- characters after 'a'.
        (
        @MyCounter,
        CHAR((@MyCounter + ASCII('a')))
        );

    -- Increment the variable to count this iteration
    -- of the loop.
    SET @MyCounter = @MyCounter + 1;
END;
GO

SET NOCOUNT OFF;
GO

-- View the data.
SELECT cola, colb FROM TestTable;
GO

DROP TABLE TestTable;
GO