Asp.net 仅更改一个数据字段时更新日期完整列
我有两张桌子A和B 表A数据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
表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