Sql server 2008 根据数据子集更新触发器中的表值

Sql server 2008 根据数据子集更新触发器中的表值,sql-server-2008,tsql,triggers,Sql Server 2008,Tsql,Triggers,好的,标题很有意思 基本上,这意味着在处理插入表中的行时,根据特定列中的值(该值将行拆分为两个子集之一),数据将以两种方式之一进行处理。现在,这可能是用光标(可能也是CTE)进行迭代的,但是有没有其他方法,下面的伪代码看起来很难看,实际上不起作用,但它让您了解我在寻找什么: 触发 一如既往,提前感谢您提供的所有帮助我认为这里的主要问题是您将inserted视为一行,而SQL Server中的所有触发器都是表级触发器。因此,inserted是一个表,不能将列与单个值进行比较。我会像下面这样做 本部

好的,标题很有意思

基本上,这意味着在处理插入表中的行时,根据特定列中的值(该值将行拆分为两个子集之一),数据将以两种方式之一进行处理。现在,这可能是用光标(可能也是CTE)进行迭代的,但是有没有其他方法,下面的伪代码看起来很难看,实际上不起作用,但它让您了解我在寻找什么:

触发
一如既往,提前感谢您提供的所有帮助

我认为这里的主要问题是您将inserted视为一行,而SQL Server中的所有触发器都是表级触发器。因此,inserted是一个表,不能将列与单个值进行比较。我会像下面这样做

本部分适用于两个分支:

update cd_units set shift_expired_status = 0
from inserted
where inserted.unid = cd_units.unid
  and inserted.shift_start <= dbo.get_dts();

使用IFinserted.ag_id“FIRE”的目的是什么?在这两种情况下,您都在将shift_EXERTED_状态更新为0。谢谢John,但如果我有选择地(双关语不是有意的)更新那些ag_id为“FIRE”的记录,但更新其余的记录,我将如何进行?CTE?@SteveMustafa你能换个说法吗?你说这两种情况都要更新。[@John Tseng]哎呀,对不起。我的意思是只更新插入的那些具有ag_id='FIRE'的记录。目前正在使用Temp Table/Table Var选项,但我非常感谢所有help@SteveMustafa我不知道你的意思。第二个查询只更新ag_id='FIRE'的记录。我已经更新了答案,使之更加明显。
update cd_units set shift_expired_status = 0
from inserted
where inserted.unid = cd_units.unid
  and inserted.shift_start <= dbo.get_dts();
update cd_units
set sask911_shift_end = substring(inserted.shift_start,5,2) + '/' +
                        substring(inserted.shift_start,7,2) + ' ' +
                        substring(inserted.shift_start,9,2) + ':' +
                        substring(inserted.shift_start,11,2)
from cd_units join inserted on cd_units.unid=inserted.unid
where inserted.ag_id = 'FIRE';