Asp.net 仅更改一个数据字段时更新日期完整列

Asp.net 仅更改一个数据字段时更新日期完整列,asp.net,sql,sql-server,sql-server-2008,c#-4.0,Asp.net,Sql,Sql Server,Sql Server 2008,C# 4.0,我有两张桌子A和B 表A数据 表B数据 Enquiry_Id Arrives_On Arrives_Details 129 2013-09-20 NA 130 2013-08-09 NA 我希望当我更新我的表B于2013年8月9日到2012年8月14日到达时,如果查询Id为130,那么我的表A数据将自动更改签入和签出日期。像 En

我有两张桌子A和B

表A数据


表B数据

 Enquiry_Id        Arrives_On   Arrives_Details      
  129              2013-09-20       NA            
  130              2013-08-09       NA           
我希望当我更新我的表B于2013年8月9日到2012年8月14日到达时,如果查询Id为130,那么我的表A数据将自动更改签入和签出日期。像

 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

您可以在表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

在表B上触发,计算先前(
删除的
)和更新的(
插入的
)值之间的差异,并将该差异添加到表A的列中

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

您必须为此使用触发器

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
使用[您的_数据库]
去
在[dbo].[表B]上创建触发器[dbo].[UpdateCheckOutDates]
更新后
作为
开始
声明@Before_Date Date、@Before_Date Date、@Date_Diff smallint、@Id int
设置@Date\u Diff=0
选择@Id=D.inquiry\u Id,@Before\u Date=D.allows\u On FROM DELETED D
从插入的I中选择@After\u Date=I
如果更新(到达时)
开始
设置@Date\u Diff=DATEDIFF(日期、日期之前、日期之后)
如果(@Date_Diff)0)
开始
更新表A集合签入=@在日期之后,
Check_Out=DATEADD(DD、@Date_Diff、@After_Date)
其中_Id=@Id
结束
结束
结束

-您尝试过什么吗?表中的现有记录会发生什么情况,我看不到o/P中的enq id 130和日期2013年8月9日这是一种非常错误的触发器使用方式。您不应该分配从
inserted
表读取的变量,而应该直接使用
inserted
表<当使用单个命令更新多个记录时,代码>插入的可以包含多行,这种方式触发器将仅对单个记录起作用。如果多个表C字段为查询Id和签入,在这个表中,check_in也反映了与表A类似的情况,其中enuiry_ID=130,那么我们如何管理3tables@Shiv您可以在下面为其他表添加另一个UPDATE语句
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