SQL Server局部变量是用户自定义的临时存储单元,仅在当前批处理、存储过程或函数的执行范围内有效,用于临时保存单个数据值,方便后续的逻辑运算、查询条件拼接等操作。

局部变量的声明
SQL Server局部变量的声明需要使用DECLARE关键字,变量名必须以@符号开头,同时需要指定变量的数据类型,语法格式如下:
-- 声明一个整型局部变量 DECLARE @user_id INT; -- 声明一个字符串类型的局部变量,指定长度为50 DECLARE @user_name VARCHAR(50); -- 同时声明多个局部变量 DECLARE @order_count INT, @total_amount DECIMAL(10,2);
变量声明之后,初始值为NULL,需要赋值后才能参与后续的计算或查询。
局部变量的赋值方式
SQL Server中给局部变量赋值主要有两种方式,分别是使用SET关键字和使用SELECT关键字,两者的使用场景和特性有一定区别。
使用SET赋值
SET是标准的变量赋值方式,每次只能给一个变量赋值,适合给变量赋单个明确的常量值。
DECLARE @product_price DECIMAL(10,2); -- 给变量赋固定数值 SET @product_price = 99.9; DECLARE @current_time DATETIME; -- 给变量赋系统函数返回值 SET @current_time = GETDATE();
使用SELECT赋值
SELECT赋值可以同时给多个变量赋值,也支持直接从查询结果中获取值赋给变量,如果查询结果返回多行,变量会保存最后一行的结果。
DECLARE @max_score INT, @min_score INT; -- 同时给多个变量赋值 SELECT @max_score = 100, @min_score = 60; -- 从表中查询结果赋值给变量 DECLARE @emp_count INT; SELECT @emp_count = COUNT(*) FROM employees WHERE department_id = 3;
两种赋值方式的区别
| 对比项 | SET | SELECT |
|---|---|---|
| 赋值数量 | 一次只能赋值一个变量 | 一次可以赋值多个变量 |
| 查询结果赋值 | 不支持直接从查询结果赋值 | 支持从查询结果获取数据赋值 |
| 标准性 | 符合ANSI SQL标准 | SQL Server特有语法 |
| 无返回值情况 | 变量保持原值(初始为NULL) | 变量保持原值(初始为NULL) |
局部变量的使用示例
局部变量可以应用在查询条件、逻辑判断、循环等多个场景中,以下是几个常见的使用示例。
作为查询条件使用
DECLARE @target_department VARCHAR(30); SET @target_department = '技术部'; -- 使用局部变量作为查询条件 SELECT employee_id, employee_name, hire_date FROM employees WHERE department_name = @target_department;
参与计算逻辑
DECLARE @unit_price DECIMAL(10,2); DECLARE @quantity INT; DECLARE @total_price DECIMAL(10,2); SET @unit_price = 25.5; SET @quantity = 10; -- 变量参与计算 SET @total_price = @unit_price * @quantity; SELECT @total_price AS 商品总价;
在逻辑判断中使用
DECLARE @score INT;
SET @score = 85;
IF @score >= 90
SELECT '等级为A' AS 成绩等级;
ELSE IF @score >= 80
SELECT '等级为B' AS 成绩等级;
ELSE
SELECT '等级为C' AS 成绩等级;
局部变量的注意事项
- 局部变量名必须以@开头,全局变量以@@开头,不要混淆两者的命名规则。
- 变量必须先声明后使用,未声明的变量直接调用会抛出错误。
- 声明变量时要选择合适的数据类型,避免数据类型不匹配导致的隐式转换问题。
- 局部变量的作用域仅限于当前批处理、存储过程或函数,超出范围后变量会失效。
- 使用
SELECT给变量赋值时,如果查询没有返回结果,变量会保持原来的NULL值,不会报错,需要额外做非空判断。
注意:在批处理中,GO语句会结束当前批处理的执行,GO之后的代码无法访问之前声明的局部变量。
SQL_Server局部变量DECLARESETSELECT修改时间:2026-06-13 09:48:31