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