Transact-SQL 变量

Transact-SQL 局部变量是可以保存特定类型的单个数据值的对象。批处理和脚本中的变量通常用于:

下列脚本创建一个小的测试表并向其写入 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
声明 Transact-SQL 变量

DECLARE 语句可以通过以下操作初始化 Transact-SQL 变量:

说明  对局部变量使用系统提供的数据类型可尽可能减少将来的维护问题。

例如,下面的 DECLARE 语句使用 int 数据类型创建名称为 @mycounter 的局部变量。

DECLARE @MyCounter INT

若要声明多个局部变量,请在定义的第一个局部变量后使用一个逗号,然后指定下一个局部变量名称和数据类型。

例如,下面的 DECLARE 语句创建三个局部变量,名称分别为 @last_name@fname@state,并将每个变量初始化为 NULL:

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

变量的作用域为可以引用该变量的 Transact-SQL 语句范围。变量的作用域从声明变量的地方开始到声明变量的批处理或存储过程的结尾。例如,下面脚本产生语法错误,因为在一个批处理中所引用的变量是在另一个批处理中定义的:

DECLARE MyVariable INT
SET @MyVariable = 1
GO -- This terminates the batch.
-- @MyVariable has gone out of scope and no longer exists.

-- This SELECT statement gets a syntax error because it is
-- no longer legal to reference @MyVariable.
SELECT *
FROM Employees
WHERE EmployeeID = @MyVariable
设置 Transact-SQL 变量中的值

第一次声明变量时将此变量的值设为 NULL。若要为变量赋值,请使用 SET 语句。这是为变量赋值的较好的方法。也可以通过 SELECT 语句的选择列表中当前所引用值为变量赋值。

若要通过使用 SET 语句为变量赋值,请包含变量名和需要赋给变量的值。这是为变量赋值的较好的方法。例如,下面的批处理声明两个变量、对它们赋值并在 SELECT 语句的 WHERE 子句中予以使用:

USE Northwind
GO
-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(20),
   @RegionVariable NVARCHAR(30)

-- Set their values.
SET @FirstNameVariable = N'Anne'
SET @RegionVariable = N'WA'

-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName, FirstName, Title
FROM Employees
WHERE FirstName = @FirstNameVariable
   OR Region = @RegionVariable
GO

变量也可以通过选择列表中当前所引用的值赋值。如果在选择列表中引用变量,则它应当被赋以标量值或者 SELECT 语句应仅返回一行。例如:

USE Northwind
GO
DECLARE @EmpIDVariable INT

SELECT @EmpIDVariable = MAX(EmployeeID)
FROM Employees
GO

如果 SELECT 语句返回多行而且变量引用一个非标量表达式,则变量被设置为结果集最后一行中表达式的返回值。例如,在此批处理中将 @EmpIDVariable 设置为返回的最后一行的 EmployeeID 值,此值为 1:

USE Northwind
GO
DECLARE @EmpIDVariable INT

SELECT @EmpIDVariable = EmployeeID
FROM Employees
ORDER BY EmployeeID DESC

SELECT @EmpIDVariable
GO

请参见

DECLARE @local_variable

SET @local_variable

SELECT