SQL 触发器 update/Insert
SQL Trigger update/Insert
我正在创建一个 table 并使用 field_1 和 2 设置 insert/update field_3 的触发器。请参阅下面的示例。
ID | Start_Date | End_Date | Period |
1 3/10/17 3/20/17 10
2 2/05/17 3/10/17 5
触发器
ALTER TRIGGER [dbo].[tr_insert_Period]
ON [dbo].[MEDICAL_EXCUSE]
for update
AS
BEGIN
SET NOCOUNT ON;
declare @Start_Date Datetime
declare @End_Date Datetime
declare @Period Float
set @Start_Date = ( select me_start_date from inserted)
set @End_Date = ( select ME_End_Date from inserted)
set @Period = ( select Period from inserted)
update MEDICAL_EXCUSE
set @Period = DATEDIFF(day,@Start_Date , @End_Date)
END
手动执行不会触发just work
非常感谢任何帮助。
不要使用触发器。只需使用计算列。我想这就是你想要的:
alter table KOPS_MEDICAL_EXCUSE
add period as (DATEDIFF(day, me_start_date, me_end_date));
请注意 datediff()
returns 是一个整数,因此没有理由将任何内容声明为 float
。
对于计算字段,通常在查询 table 时计算该值。如果需要,您可以使用 PERSISTED
关键字具体化该值。
我发现你的触发器有几个问题。首先,您永远不能假设只会更新一条记录。企业数据库(通常是唯一一种复杂到需要触发器的数据库)经常在用户应用程序之外访问,并且可能会出现大量插入。
接下来,您要从插入中获取记录,因此需要插入触发器。最后,您要更新变量 @period 的值,而不是 table.
中的字段 Period
试试这个:
ALTER TRIGGER [dbo].[tr_insert_Period]
ON [dbo].[MEDICAL_EXCUSE]
for insert
AS
BEGIN
UPDATE ME
SET Period = DATEDIFF(day,i.Start_Date , i.End_Date)
FROM MEDICAL_EXCUSE ME
JOIN Inserted i on i.id = me.id
END
您可能还希望它也适用于更新,因此请将其设为:
FOR Insert, update
我正在创建一个 table 并使用 field_1 和 2 设置 insert/update field_3 的触发器。请参阅下面的示例。
ID | Start_Date | End_Date | Period |
1 3/10/17 3/20/17 10
2 2/05/17 3/10/17 5
触发器
ALTER TRIGGER [dbo].[tr_insert_Period]
ON [dbo].[MEDICAL_EXCUSE]
for update
AS
BEGIN
SET NOCOUNT ON;
declare @Start_Date Datetime
declare @End_Date Datetime
declare @Period Float
set @Start_Date = ( select me_start_date from inserted)
set @End_Date = ( select ME_End_Date from inserted)
set @Period = ( select Period from inserted)
update MEDICAL_EXCUSE
set @Period = DATEDIFF(day,@Start_Date , @End_Date)
END
手动执行不会触发just work
非常感谢任何帮助。
不要使用触发器。只需使用计算列。我想这就是你想要的:
alter table KOPS_MEDICAL_EXCUSE
add period as (DATEDIFF(day, me_start_date, me_end_date));
请注意 datediff()
returns 是一个整数,因此没有理由将任何内容声明为 float
。
对于计算字段,通常在查询 table 时计算该值。如果需要,您可以使用 PERSISTED
关键字具体化该值。
我发现你的触发器有几个问题。首先,您永远不能假设只会更新一条记录。企业数据库(通常是唯一一种复杂到需要触发器的数据库)经常在用户应用程序之外访问,并且可能会出现大量插入。
接下来,您要从插入中获取记录,因此需要插入触发器。最后,您要更新变量 @period 的值,而不是 table.
中的字段 Period试试这个:
ALTER TRIGGER [dbo].[tr_insert_Period]
ON [dbo].[MEDICAL_EXCUSE]
for insert
AS
BEGIN
UPDATE ME
SET Period = DATEDIFF(day,i.Start_Date , i.End_Date)
FROM MEDICAL_EXCUSE ME
JOIN Inserted i on i.id = me.id
END
您可能还希望它也适用于更新,因此请将其设为:
FOR Insert, update