Tus*_* T. 2 sql sql-server-2008
USE admin_gorace
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'trScheduler_Status_Update' AND type = 'TR')
DROP TRIGGER trScheduler_Status_Update
GO
CREATE TRIGGER trScheduler_Status_Update
ON [Client].[Scheduler]
FOR INSERT, UPDATE, DELETE , SELECT
AS
UPDATE [Client].[Scheduler] set [Status]='Over'
where (Convert(varchar,[Scheduler_Date],101) <=Convert(varchar,getutcdate(),101) or Convert(varchar,[Scheduler_Date],101) <= Convert(varchar,getdate(),101))
and (right(CONVERT( varchar, [time_to], 100),7)<= right(CONVERT( varchar, getutcdate(), 100),7) or right(CONVERT( varchar, [time_to], 100),7) <= right(CONVERT( varchar, getdate(), 100),7))
and [Status]!='Cancelled' and [Status]!='Over'
Run Code Online (Sandbox Code Playgroud)
走
在INSERT,UPDATE,DELETE触发器可以工作,但如何让它工作或SELECT语句前
您设置表格的方式似乎存在许多问题。希望你能改变它们。而不是你当前的设置,以及你试图用触发器做什么,我有:
create table Scheduler (
/* Columns - don't know what */
EndDate datetime2 not null,
CancelledAt datetime2 null,
Status as CASE
WHEN CancelledAt is not null THEN 'Cancelled'
WHEN EndDate < getutcdate() THEN 'Over'
ELSE 'Current' END
)
Run Code Online (Sandbox Code Playgroud)
现在,不必对表执行手动更新,该Status列总是正确的——您只需查询它。请注意,我已将Scheduler_Date和合并time_to到一个datetime2名为EndDate- 的列中- 似乎没有充分的理由将其拆分为两个单独的列。这也使比较更简单。
我还选择仅基于以下进行比较getutcdate()- 您当前的代码似乎正在尝试(有点糟糕)处理可能是 UTC 或本地日期的混合值 - 但不会做得很好 - 所以请防止它首先是一个问题,并且只在表中存储一种类型的日期时间值。