【问题标题】:update date full column on changing only one datafield仅更改一个数据字段时更新日期完整列
【发布时间】:2013-09-11 07:05:33
【问题描述】:

我有 2 个表 A 和 B

表A数据


Enquiry_Id  Ckeck_In    check_Out   Place
129         2013-09-20  2013-09-23  Delhi
130         2013-08-09  2013-08-10  Agra
130         2013-08-10  2013-08-12  Punjab
130         2013-08-12  2013-08-13  Haryana

表 B 数据

 Enquiry_Id        Arrives_On   Arrives_Details      
  129              2013-09-20       NA            
  130              2013-08-09       NA           

我希望当我将我的表 B Arrives_on Date 2013-08-09 更新为 2012-08-14 其中 enquiry_Id 为 130 时,我的表 A 数据将自动更改 check_In 和 Check_Out 日期。喜欢

 Enquiry_Id Ckeck_In    check_Out   Place
129         2013-09-20  2013-09-23  Delhi
130         2013-08-14  2013-08-15  Agra
130         2013-08-15  2013-08-17  Punjab
130         2013-08-17  2013-08-18  Haryana

【问题讨论】:

  • -你试过了吗?
  • 表中现有记录会发生什么,我在 o/p 中看不到 enq id 130 和日期 09/08/2013

标签: asp.net sql sql-server sql-server-2008 c#-4.0


【解决方案1】:

在 TableB 上触发,您可以在其中计算先前 (DELETED) 和更新后 (INSERTED) 值之间的差异,并将该差异添加到您的 TableA 列中。

CREATE TRIGGER tgTableBUpdate ON TableB
AFTER UPDATE 
AS
BEGIN

    UPDATE a
        SET a.Ckeck_In = DATEADD(DD, DATEDIFF(DD,d.Arrives_On, i.Arrives_On), a.Ckeck_In)
       ,a.Check_Out = DATEADD(DD, DATEDIFF(DD,d.Arrives_On, i.Arrives_On), a.check_Out)
    FROM INSERTED i
    INNER JOIN DELETED d ON i.Enquiry_Id = d.Enquiry_Id
    INNER JOIN dbo.TableA a ON i.Enquiry_Id = a.Enquiry_Id AND d.Enquiry_Id = a.Enquiry_Id

END

SQLFiddle DEMO

【讨论】:

  • 如果表C多一个字段是enquiry_Id和Check_In,这个表check_in也反映像A表enuiry_ID = 130那3个表怎么管理
  • @Shiv 您可以在下面为其他表添加另一个 UPDATE 语句
【解决方案2】:

您可以在表 B 上的数据库中创建更新触发器

CREATE TRIGGER trgAfterUpdate ON [dbo].[B] 
FOR UPDATE
AS
    declare @ArrivesOn datetime;
    declare @id int;

    SELECT @id =i.Enquiry_Id, @ArrivesOn=Arrives_On from inserted i;   

      -- perform update.insert here  like
      -- Insert into A(Enquiry_Id,NewDate) values(@id ,@ArrivesOn)

GO

【讨论】:

  • 这是非常错误的触发器使用方式。您永远不应分配从inserted 表中读取的变量,而应直接使用inserted 表。当使用单个命令更新更多记录时,Inserted 可以包含多行,这样触发器将只对单个记录起作用。
【解决方案3】:

你必须为此使用触发器。

USE [YOUR_DATABASE]
GO
CREATE TRIGGER [dbo].[UpdateCheckInCheckOutDates] ON [dbo].[Table_B]
AFTER UPDATE
AS
BEGIN
  DECLARE @Before_Date date, @After_Date date, @Date_Diff smallint, @Id int
  SET @Date_Diff = 0

  SELECT @Id = D.Enquiry_Id, @Before_Date = D.Arrives_On FROM DELETED D
  SELECT @After_Date = I.Arrives_On FROM INSERTED I

  IF UPDATE(Arrives_On)
  BEGIN 
    SET @Date_Diff = DATEDIFF(day, @Before_Date, @After_Date)
    IF(@Date_Diff) <> 0)
    BEGIN
      UPDATE Table_A SET Check_In = @After_Date,
             Check_Out = DATEADD(DD, @Date_Diff, @After_Date)
             WHERE Enquiry_Id = @Id
    END
  END
END

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多