SQL触发器更新/插入
我正在创建一个表并设置一个触发器,以使用字段_1和2插入/更新字段_3。请参见下面的示例SQL触发器更新/插入,sql,sql-server,database-trigger,Sql,Sql Server,Database Trigger,我正在创建一个表并设置一个触发器,以使用字段_1和2插入/更新字段_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
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
如果您手动执行,它不会触发仅工作
非常感谢任何帮助。不要使用触发器。只需使用计算列。我想这就是你想要的:
alter table KOPS_MEDICAL_EXCUSE
add period as (DATEDIFF(day, me_start_date, me_end_date));
请注意,datediff()
返回一个整数,因此没有理由将任何内容声明为float
对于计算字段,通常在查询表时计算值。如果需要,可以使用
持久化的
关键字具体化该值。不要使用触发器。只需使用计算列。我想这就是你想要的:
alter table KOPS_MEDICAL_EXCUSE
add period as (DATEDIFF(day, me_start_date, me_end_date));
请注意,datediff()
返回一个整数,因此没有理由将任何内容声明为float
对于计算字段,通常在查询表时计算值。如果需要,可以使用
持久化的
关键字来具体化该值。我在触发器中看到了几个问题。首先,您永远不能假设只更新一条记录。企业数据库(通常是唯一一种复杂到需要触发器的数据库)通常在用户应用程序外部访问,并且可能会出现一个大的插入
接下来,您希望从insert获取记录,因此它需要是insert触发器。最后更新变量@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
我发现你的扳机有几个问题。首先,您永远不能假设只更新一条记录。企业数据库(通常是唯一一种复杂到需要触发器的数据库)通常在用户应用程序外部访问,并且可能会出现一个大的插入 接下来,您希望从insert获取记录,因此它需要是insert触发器。最后更新变量@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
什么是你的ASKE也请考虑在格式化文本中添加示例表数据和预期结果。OP可能不知道的一个问题是,当更新多行时,这将失败。触发器在每个语句中工作,而不是每行。从不,我的意思是在任何情况下都不会将字段的值从inserted或deleted设置为标量变量。当有人插入、更新或删除多条记录时,这将非常失败。更糟糕的是,它不会出错,只会使用其中一条记录中的数据。这是最终数据完整性问题的保证。@HLGEM-更糟糕的是,将其写成3个独立的
select
s,它们甚至不能保证为每个变量集从同一行获得数据。您的ASK也请考虑在格式化文本中添加示例表数据和预期结果。OP可能不知道的一个问题是,当更新多行时,这将失败。触发器在每个语句中工作,而不是每行。从不,我的意思是在任何情况下都不会将字段的值从inserted或deleted设置为标量变量。当有人插入、更新或删除多条记录时,这将非常失败。更糟糕的是,它不会出错,只会使用其中一条记录中的数据。这是最终数据完整性问题的保证。@HLGEM-更糟糕的是,将其写成3个独立的select
s,他们甚至不能保证为每个变量集从同一行获取数据。我之所以使用触发器和浮点是因为应用程序的限制。@mesi-即使您需要它是float
,也可以在这里使用cast
或convert
来实现。我还强烈推荐一个计算列——这会省去麻烦。我同意这是第一选择,但前提是在我的回答中提供了触发信息,因为他似乎不被允许这样做。同样,OP可以理解他的扳机存在的问题。谢谢你们的帮助。“非常感谢。”梅西。什么样的申请限制。如果可以添加触发器,则应该能够添加计算列。计算列更易于维护。而持久化计算列只执行一次计算。我之所以使用触发器和浮点是因为应用程序限制。@mesi-即使您需要它是float
,也可以在此处使用cast
或convert
来完成。我还强烈推荐一个计算列——这会省去麻烦。我同意这是第一选择,但前提是在我的回答中提供了触发信息,因为他似乎不被允许这样做。同样,OP可以理解他的扳机存在的问题。谢谢你们的帮助。“非常感谢。”梅西。什么样的申请限制。如果可以添加触发器,则应该能够添加计算列。计算列更易于维护。持久化计算列只执行一次计算。始终使用单记录插入、更新和多记录插入和更新测试插入/更新触发器。确定。我使用了你的脚本并进行了测试。当我将同一记录用于另一个多行时,它会将此记录的另一行更新为同一内容。始终使用单记录插入、更新和多记录插入和更新测试插入/更新触发器。确定。我使用了你的脚本并进行了测试。当我将同一条记录用于另一个多行时,它会将该记录的另一行更新为相同的内容。