SQL Server 遍历表中记录的两种方法

凌晨两点半
凌晨两点半
发布时间:2026-10-15 | 3人浏览过
原创

了解如何在 SQL Server 中逐行处理数据:通过表变量配合循环实现删除式遍历或保留数据读取,以及使用标准游标的完整生命周期管理,并掌握两者的性能差异与适用场景。

结果与目标

在 T-SQL 脚本中需要对表中的多行数据进行逐条处理时,常见做法是借助表变量进行循环筛选与删除,或者使用标准游标按顺序提取数据。下面分别给出可运行的示例与关键注意点。

准备条件

  1. 具备 SQL Server 实例访问权限,版本支持 TABLE 变量与本地游标(大多数版本默认支持)。
  2. 创建一个用于演示的目标表结构:
DECLARE @temp TABLE (
    [id] INT IDENTITY(1, 1),
    [Name] VARCHAR(10)
);
-- 插入示例数据
INSERT INTO @temp VALUES ('a');
INSERT INTO @temp VALUES ('b');
INSERT INTO @temp VALUES ('c');
INSERT INTO @temp VALUES ('d');
INSERT INTO @temp VALUES ('e');

真实操作顺序

第1步:用表变量循环遍历(删除方式)

目的:在不引入游标的情况下,利用 WHILE 循环逐行提取并删除已处理记录。适合小数据集或一次性批处理场景。

入口:T-SQL 查询窗口。

动作与参数:

  • 若使用 SET ROWCOUNT 1 限制每次只取一行,请注意:SET ROWCOUNT 可能影响后续的 DELETE、INSERT、UPDATE 语句。因此更推荐直接使用 TOP 1。
  • 正确且安全的循环逻辑应包含:判断存在待处理行 → 取出第一条 → 执行业务逻辑 → 删除该行 → 循环继续。

代码示例:

DECLARE @tempId INT,
        @tempName VARCHAR(10);

WHILE EXISTS (SELECT [id] FROM @temp)
BEGIN
    SELECT TOP 1
        @tempId = [id],
        @tempName = [Name]
    FROM @temp;

    -- 此处替换为实际的业务逻辑,例如打印
    PRINT 'Name:----' + @tempName;

    -- 删除已处理的行
    DELETE FROM @temp WHERE [id] = @tempId;
END;

第2步:用游标遍历(保留原表数据)

目的:在不修改源数据的前提下,按顺序逐行获取字段值,适用于需要保留原始数据的复杂处理流程。

入口:T-SQL 查询窗口。

动作与参数:

  • 声明一个本地局部游标,指定列集合。
  • 打开游标后,通过 @@FETCH_STATUS = 0 判断是否成功提取下一行。
  • 循环体内执行 FETCH NEXT ... INTO ...,完成处理后依次关闭并释放游标。

代码示例:

-- 假设已有 @temp 表并填入数据

DECLARE @tempId INT,
        @tempName VARCHAR(10);

-- 定义游标
DECLARE test_Cursor CURSOR LOCAL FOR
    SELECT [id], [Name] FROM @temp;

-- 打开游标
OPEN test_Cursor;

-- 读取第一行
FETCH NEXT FROM test_Cursor INTO @tempId, @tempName;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'Name:----' + @tempName;

    FETCH NEXT FROM test_Cursor INTO @tempId, @tempName;
END;

CLOSE test_Cursor;
DEALLOCATE test_Cursor;

完成判断

  • 表变量循环:当 @temp 为空且不再进入 WHILE 主体时结束。
  • 游标方式:当 FETCH 返回非 0 状态,循环退出,随后执行 CLOSE 和 DEALLOCATE 确认资源回收。

原文有依据的排错

在提供的原始素材中,第二个“修改后”的代码块存在以下问题与建议修正方向:

  • 未正确初始化变量导致报错:示例中直接使用了 @tempId 与 @tempName,但未声明它们的类型。正确的做法是先 DECLARE 变量。
  • SET ROWCOUNT 的副作用:旧版示例曾依赖 SET ROWCOUNT 1 来限制单行返回,但此设置会影响后续 DML 语句的行为,因此建议使用 TOP 1 替代。
  • EXEC('drop table ')` 错误语法:示例片段中包含 EXEC('drop table ')` 这样的无效拼接。在实际使用中,应避免动态拼接字符串来删除表或数据对象,尤其是涉及系统表或用户定义的临时表。

简要总结

SQL Server 提供了多种方式来遍历表数据:表变量循环适用于不保留原始数据的轻量处理;游标则能更安全地读取每一行而无需改动源数据。选择哪种方式需权衡数据集大小与性能需求,通常面向集合的操作优于逐行的光标遍历,但在特定业务逻辑下,这两种方式仍是非常实用的手段。

以上就是 SQL Server 遍历表中记录的方法(表变量与游标)的详细内容,更多关于 SQL Server 遍历表中记录的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表