SQL Server 常用函数、事务处理与触发器实战
本文深入解析 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 常用函数、事务处理及触发器编写的详细内容,更多关于数据库优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









