【问题标题】:Trigger update the rest of the table values once one attribute has been populated填充一个属性后触发更新其余表值
【发布时间】:2020-02-16 21:18:49
【问题描述】:

我想创建一个触发器,一旦插入了一个属性,它将填充表中的其余值。

因此,一旦插入了日期,我就需要触发器来填写其余列。

CREATE TABLE dim_date 
(
    Date_Id INTEGER
        CONSTRAINT date_id_pk PRIMARY KEY IDENTITY (1,1),
    CalendarDate DATE NOT NULL,
    CalendarYear VARCHAR (20),
    CalendarQuarter VARCHAR (20),
    CalendarMonth VARCHAR (20),
    CalendarMonthNumber SMALLINT,
    CalendarDateNumber SMALLINT,
    CalendarYearNumber SMALLINT,
    CalendarQuarterNumber CHAR(1),
    CalendarWeek SMALLINT,
    CalendarWeekdayNumber Char(1),
    CalendarWeekday VARCHAR (20),
    CalendarWeekNumber SMALLINT,
    CalendarHalf CHAR(1)
);

INSERT INTO dim_date (CalendarDate) 
VALUES ('2018-07-26'),
       ('2017-05-02'),
       ('2015-09-10'),
       ('2017-04-23');

CREATE TRIGGER trg_date ON dim_date
FOR INSERT
AS 
    UPDATE dim_date 
    SET CalendarYear = (SELECT YEAR(CalendarDate) FROM INSERTED)
    WHERE -- not sure how to proceed from here
GO

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    您基本上需要使用适当的关系、基于集合的方法 - 通过 加入Inserted 伪表,并为那些新插入的行设置日期部分信息。

    类似这样的事情:

    CREATE TRIGGER trg_date 
    ON dim_date
    FOR INSERT
    AS 
        UPDATE dd
        SET CalendarYear = YEAR(dd.CalendarDate),
            CalendarQuarter = DATEPART(Quarter, dd.CalendarDate),
            CalendarMonthNumber = MONTH(dd.CalendarDate)
            -- and so on, for all the other DATEPART pieces you need
    
        FROM dim_date dd
        -- join on the primary key to update all rows that were newly inserted only
        INNER JOIN Inserted i ON dd.Date_Id = i.Date_Id 
    GO
    

    现在您只需要填写您需要确定的剩余日期部分 - 检查official MS documentation on DATEPART 以获得见解!

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多