SQL触发器更新/插入

时间:2017-03-27 14:21:43

标签: sql sql-server database-trigger

我正在创建一个表并设置一个触发器,使用field_1和2插入/更新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

如果你手动执行它不会触发工作。

任何帮助都得到了很多赞赏。

2 个答案:

答案 0 :(得分:3)

不要使用触发器。只需使用计算列。我想这就是你想要的:

const slotTemplate = `<div><h4>This is the slot content</h4></div>`
const instance = new Slide();
instance.$slots.default = [instance.$createElement(Vue.compile(slotTemplate))];
instance.$mount("#container");

请注意alter table KOPS_MEDICAL_EXCUSE add period as (DATEDIFF(day, me_start_date, me_end_date)); 返回一个整数,因此没有理由将任何内容声明为datediff()

使用计算字段时,通常在查询表时计算该值。如果您想使用float关键字,则可以实现该值。

答案 1 :(得分:1)

我在触发器中看到的几个问题。首先,你永远不能假设只有一条记录会被更新。企业数据库(通常是唯一需要触发器的复杂类型)通常在用户应用程序外部访问,并且可能会出现大型插入。

接下来,您希望从插入中获取记录,因此它需要是插入触发器。最后,您要更新变量@period的值,而不是表中的字段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