Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL触发器更新/插入_Sql_Sql Server_Database Trigger - Fatal编程技术网

SQL触发器更新/插入

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

我正在创建一个表并设置一个触发器,以使用字段_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

  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可以理解他的扳机存在的问题。谢谢你们的帮助。“非常感谢。”梅西。什么样的申请限制。如果可以添加触发器,则应该能够添加计算列。计算列更易于维护。持久化计算列只执行一次计算。始终使用单记录插入、更新和多记录插入和更新测试插入/更新触发器。确定。我使用了你的脚本并进行了测试。当我将同一记录用于另一个多行时,它会将此记录的另一行更新为同一内容。始终使用单记录插入、更新和多记录插入和更新测试插入/更新触发器。确定。我使用了你的脚本并进行了测试。当我将同一条记录用于另一个多行时,它会将该记录的另一行更新为相同的内容。