SQL存储过程GETDATE()用法及列去重插入触发器编写问题咨询
问题修复方案
场景1:SUPPLY表日期校验存储过程
原有代码问题
GETDATE()返回值包含时分秒,和仅存储日期的SUPPLY_DATE列直接做等值判断,会因为时分秒不匹配几乎永远返回假- 直接用
SELECT *的结果作为IF判断条件,逻辑不严谨,存在隐式转换风险,性能也差
修复后代码
CREATE PROCEDURE P2 AS BEGIN SET NOCOUNT ON; -- 将当前时间截断到日期维度,和SUPPLY_DATE的精度匹配 IF EXISTS (SELECT 1 FROM SUPPLY WHERE SUPPLY_DATE = CAST(GETDATE() AS DATE)) BEGIN SELECT 'SUPPLY TODAY' AS SUPPLY END ELSE BEGIN SELECT 'NO SUPPLY TODAY' AS SUPPLY END IF @@ERROR = 0 SELECT 'OK' AS OK END
场景2:THINGS表重复name校验触发器
原有代码问题
- 触发条件写的是
EXISTS (SELECT * FROM THINGS),只要THINGS表存在任何数据就会触发回滚,和需求完全不符 - 没有关联
inserted系统临时表(存储本次插入的所有新数据),没有实现校验新插入name是否重复的逻辑
修复后代码
CREATE TRIGGER T3 ON THINGS AFTER INSERT AS BEGIN SET NOCOUNT ON; -- 代码中的id为THINGS表的主键列名,若实际主键名不同请替换为对应列名 IF EXISTS ( SELECT 1 FROM THINGS t INNER JOIN inserted i ON t.name = i.name -- 匹配相同name AND t.id <> i.id -- 排除主键相同的同一条记录 ) BEGIN ROLLBACK TRANSACTION; RAISERROR('THERE IS A THING WITH THAT NAME', 16, 1); END END
内容的提问来源于stack exchange,提问作者Miłosz
相关产品推荐
相关产品推荐

