SQL Server 常用函数、事务处理与触发器实战

沈知远
沈知远
发布时间:2026-10-15| 6人浏览过
原创

本文深入解析 SQL Server 数据库开发中的核心技能,涵盖数据清洗与处理的常用函数(如 distinct、convert),逻辑控制语句(if-else、while),以及保障数据一致性的事务管理机制。同时提供增删操作下触发器的编写范例,助力构建更稳健的数据应用。

常用数据处理与控制函数

在编写 SQL 脚本时,灵活运用内置函数可以有效提升代码的健壮性与可读性。以下是几个高频使用的操作:

第1步:去除重复数据 (Distinct)

DISTINCT 用于筛选结果集中的唯一值,常配合 SELECT 语句使用,自动移除重复的行记录。

第2步:声明局部变量 (Declare)

使用 DECLARE @变量名 数据类型 可在脚本中定义临时存储数据的容器。例如:DECLARE @x INT 声明一个整型变量 @x。

第3步:数据类型转换 (Convert & Cast)

当需要将某一列的值转换为字符串或其他类型时,推荐使用以下两种方法:

  • CONVERT:T-SQL 特有语法,支持格式参数。
    示例:CONVERT(VARCHAR(20), tscore.tenglish) 将字段 tenglish 转换为20位长度的字符串。
  • CASE:标准的 SQL 类型转换函数。
    示例:CAST(xx AS VARCHAR(10)) 将表达式 xx 强制转换为10位长度的字符串。

第4步:逻辑分支与循环

  • Case When Else End:实现类似程序语言中 Switch/If 的逻辑判断。
    结构:CASE WHEN 条件 THEN 结果 ELSE 默认 END。
  • While 循环:当满足特定条件时重复执行代码块。
    结构:WHILE 条件 BEGIN ... END。

事务处理机制与实现

事务(Transaction)是保证数据库操作原子性的关键,确保一组操作要么全部成功,要么全部失败回滚。以下展示两种常见的 T-SQL 事务写法:

第1步:基于错误码检测的事务回滚

这是较传统的做法,通过累加系统变量 @@ERROR 来判断每一步是否出错。若出错总数不为0,则执行回滚。

BEGIN TRAN
DECLARE @sum INT = 0
-- 假设从账户0001扣款
UPDATE bank SET balance = balance - 1000 WHERE cid = '0001'
SET @sum = @sum + @@ERROR
-- 假设向账户0002入账
UPDATE bank SET balance = balance + 1000 WHERE cid = '0002'
SET @sum = @sum + @@ERROR

IF @sum <> 0
BEGIN
    ROLLBACK
    PRINT '回滚!'
END
ELSE
BEGIN
    COMMIT TRAN
    PRINT '提交了!'
END

第2步:基于 Try-Catch 异常捕获的事务

现代 SQL Server 推荐使用 TRY...CATCH 结构,能更优雅地处理运行时错误:

BEGIN TRAN
BEGIN TRY
    DECLARE @sum INT = 0
    UPDATE bank SET balance = balance - 900 WHERE cid = '0001'
    SET @sum = @sum + @@ERROR
    UPDATE bank SET balance = balance + 900 WHERE cid = '0002'
    SET @sum = @sum + @@ERROR
    COMMIT
END TRY
BEGIN CATCH
    ROLLBACK
END CATCH

此外,对于需要向上取整的计算场景,可使用 CEILING() 函数,例如:DECLARE @halfCount INT = CEILING(@count / 2.0)。

触发器的创建与应用

触发器是一种特殊的存储过程,它在特定的数据库事件(如 INSERT、DELETE、UPDATE)发生时自动执行。以下演示如何在表 TblClass 上添加插入和删除触发器。

第1步:创建插入后的触发器 (After Insert)

目的是在数据插入成功后,提取新插入行的数据进行日志打印或后续处理。这里利用伪表 INSERTED 获取刚写入的数据。

CREATE TRIGGER tri_TblClass_insert_after
ON TblClass AFTER INSERT
AS
BEGIN
    DECLARE @id INT
    DECLARE @name VARCHAR(50)
    DECLARE @desc VARCHAR(50)
    
    -- 从 inserted 虚拟表中读取新插入的数据
    SELECT @id = tclassId, @name = tclassname, @desc = tclassdesc FROM inserted
    
    PRINT @id
    PRINT @name
    PRINT @desc
END

第2步:创建删除时的拦截触发器 (Instead Of Delete)

此处使用了 INSTEAD OF 触发器,意味着原始的删除动作将被取消,转而执行自定义逻辑(如先备份再决定是否物理删除,或直接只保存历史)。这里演示将删除的数据先备份到 TblClassBak 表中。

CREATE TRIGGER tri_TblClass_delete_after
ON TblClass INSTEAD OF DELETE
AS
BEGIN
    -- 将即将被删除的数据存入备份表
    INSERT INTO TblClassBak
    SELECT * FROM deleted
END

以上就是关于 SQL Server 常用函数、事务处理及触发器编写的详细内容,更多关于数据库优化的资料请关注本站其它相关文章!

相关标签:

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

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 算法库。