You need to enable JavaScript to run this app. SQL存储过程GETDATE()用法及列去重插入触发器编写问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 17:06:07