用于修改要插入的数据的触发器不起作用(语句包含没有INTO子句的OUTPUT子句)

时间:2017-06-28 07:18:23

标签: sql sql-server

我需要非常简单的任务 - 将两个列中的日期和时间替换为要插入到表中的列。这传播到非常困难的事情。我尝试了许多事情,从How can I edit values of an INSERT in a trigger on SQL Server?开始。然后我阅读了关于OUTPUT并尝试了这个:

CREATE TRIGGER RouteSheetRecordDatesCorrection ON dbo.RouteSheetRecords
AFTER INSERT 
AS  
BEGIN 
DECLARE @T TABLE
(
  [Id] int,
  [AccomplishmentDate] datetime2,
  [RouteSheetRecordOperationId] int,
  [WorkerName] varchar(50),
  [RouteSheetProductId] varchar(72),
  [Notes] varchar(500),
  [Location] varchar(100),
  [CreationDate] datetime2,
  [Creator] varchar(30),
  [Components] varchar(max)
)
UPDATE dbo.RouteSheetRecords
SET AccomplishmentDate = GETDATE(), CreationDate = GETDATE()
OUTPUT inserted.Id,
       inserted.AccomplishmentDate,
       inserted.RouteSheetRecordOperationId,
       inserted.WorkerName,
       inserted.RouteSheetProductId,
       inserted.Notes,
       inserted.Location,
       inserted.CreationDate,
       inserted.Creator,
       inserted.Components
INTO @T
WHERE Id = (SELECT Id FROM inserted)
END  
GO  

但无论我尝试什么,在插入新行时总是会收到带有此消息的SqlException:

如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表'dbo.RouteSheetRecords'不能具有任何已启用的触发器。

1 个答案:

答案 0 :(得分:0)

问题是PetaPoco ORM在使用Database.Insert方法时插入了OUTPUT语句,并且此语句与触发器不兼容。解决方法是不将datetime2列转换为数据库并使用数据库中的默认值或创建存储过程来插入数据。