SQL Server T-SQL变量详解:全局与局部变量的声明、赋值及使用技巧

温以宁
温以宁
发布时间:2026-10-13| 5人浏览过
原创

在SQL Server的T-SQL编程中,合理运用变量能显著提升代码的灵活性与执行效率。文章区分了系统级全局变量和用户级局部变量,深入解析DECLARE声明规范及SET与SELECT两种赋值方式的差异,并展示如何利用局部表变量实现高效的内存内数据处理。

变量的种类

T-SQL中的变量根据作用域和定义权限,主要分为两类:

  • 全局变量 (Global Variables):由SQL Server系统预定义,以两个@符号(@@)开头。它们存储系统配置、统计信息或上次操作的状态,用户仅具备读取权限,不可直接赋值修改。
  • 局部变量 (Local Variables):由开发者自定义,以一个@符号开头。其生命周期局限于当前批处理(Batch),常用于临时存储中间结果或控制逻辑。

全局变量详解

主要用途

全局变量主要用于获取SQL Server的运行状态和环境配置,例如连接数、错误代码、最后插入的主键值等。开发者常在调试或监控脚本中调用它们来评估系统表现。

常用全局变量列表

以下是T-SQL中常用全局变量的功能说明:

-- 基本运行状态
SELECT @@VERSION;          -- SQL Server 版本与日期
SELECT @@SERVERNAME;       -- 服务器名称
SELECT @@SERVICENAME;      -- 服务名

-- 性能与资源统计(自启动累计)
SELECT @@CPU_BUSY / 100;   -- CPU工作时间(毫秒)
SELECT @@IO_BUSY / 100;    -- I/O工作时间(毫秒)
SELECT @@TOTAL_READ;       -- 磁盘读取次数
SELECT @@TOTAL_WRITE;      -- 磁盘写入次数

-- 连接与会话设置
SELECT @@MAX_CONNECTIONS;  -- 允许的最大连接数
SELECT @@LOCK_TIMEOUT;     -- 锁超时设置(毫秒)
SELECT @@LANGUAGE;         -- 当前语言名
SELECT @@DATEFIRST;        -- 每周第一天的设定值

-- 数据操作反馈
SELECT @@ERROR;            -- 上一条语句的错误号(0为成功)
SELECT @@ROWCOUNT;         -- 上一条语句影响的行数
SELECT @@IDENTITY;         -- 最后插入的标识列值
SELECT @@TRANCOUNT;        -- 当前活动事务数量

-- 游标与时间戳
SELECT @@CURSOR_ROWS;      -- 打开游标中剩余的匹配行数
SELECT @@DBTS;             -- 当前数据库的 timestamp 值

局部变量详解

声明规则

局部变量必须使用 DECLARE 关键字定义,命名必须以 @ 开头。必须指定数据类型和长度。注意:不支持 text、ntext 和 image 类型。若未指定字符型变量的长度,默认长度为1。

-- 声明整数变量
DECLARE @i int;

-- 声明字符串变量,指定长度为20
DECLARE @Name nvarchar(20); 

赋值方法对比

赋值主要有两种方式:SET 和 SELECT。两者在大多数场景下等效,但在处理多行结果或未返回值时表现不同。

1. 使用 SET 赋值

SET 是标准的ANSI SQL赋值方式,严谨但受限。当从子查询赋值时,如果查询返回多行,将报错。

-- 简单赋值
DECLARE @i int = 10;

-- 从标量子查询赋值(必须只返回一行一列)
DECLARE @MaxAge int;
SET @MaxAge = (SELECT MAX(Age) FROM Person);

2. 使用 SELECT 赋值

SELECT 赋值更灵活,可同时给多个变量赋值。但若查询返回多行,它会取最后一行的值覆盖给变量,且不会报错。

-- 同时给多个变量赋值
DECLARE @Count int, @Name varchar(50);
SELECT @Count = COUNT(*), @Name = MAX(Name) FROM Person_1;

-- 从查询结果赋值(若多行,取最后一行)
DECLARE @LastAge int;
SELECT @LastAge = Age FROM Person_1 ORDER BY Id DESC;

未返回值时的行为差异

这是一个关键的排错点:

  • SELECT 赋值:若表达式未返回值(如WHERE条件不匹配),变量保持原值不变。
  • SET 赋值:若表达式无结果,变量会被赋值为 NULL。
DECLARE @Result varchar(50) = 'Initial';

-- 假设ID=999不存在于表中
SELECT @Result = Name FROM Person WHERE Id = 999; 
PRINT @Result; -- 输出: Initial (值未变)

SET @Result = (SELECT Name FROM Person WHERE Id = 999);
PRINT @Result; -- 输出: (NULL) (值被清空)

局部表变量(Table Variable)

局部表变量是一种特殊的变量,用于在内存中临时存储数据集。与普通表或全局临时表相比,它具有以下优势:

  • 性能优越:全程驻留内存,无需写日志,速度极快。
  • 作用域隔离:仅在声明它的批处理内有效,自动清理。
  • 轻量连接:适合作为复杂查询中的中间暂存表进行JOIN操作。

使用示例

-- 声明表变量结构
DECLARE @TempTable TABLE (
    Id INT,
    Name NVARCHAR(50)
);

-- 插入数据
INSERT INTO @TempTable 
SELECT Id, Name FROM Person_1 WHERE Status = 1;

-- 像普通表一样查询或连接
SELECT t.* FROM @TempTable t 
JOIN GlobalInfo g ON t.Id = g.PersonId;

以上就是SQL Server T-SQL中使用变量的详细内容,更多关于T-SQL语法与数据库优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。