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

Posted

技术标签:

【中文标题】修改要插入的数据的触发器不起作用(语句包含没有 INTO 子句的 OUTPUT 子句)【英文标题】:Trigger for modifying data to be inserted does not work (statement contains an OUTPUT clause without INTO clause) 【发布时间】:2017-06-28 07:18:22 【问题描述】:

我需要非常简单的任务 - 替换要插入表格的两列中的日期和时间。这传播到非常困难的事情。我尝试了很多东西,从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:

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

【问题讨论】:

你为什么要使用OUTPUT?如果您只想更新这两个列,那就去做——没有必要用第二个表来解决问题。 (另外,因为它们是DATETIME2,所以使用SYSDATETIME(),而不是GETDATE()——你正在丢掉精度。)(另外,永远不要忘记你的触发器中的SET NOCOUNT ON。)(另外,使用WHERE Id IN,不是WHERE Id = 。更新可以影响尽可能多的行。) 请注意,如果 其他代码 尝试使用不使用 INTOOUTPUT 子句在此表上执行插入/更新,它将失败,因为您的触发器(使用您发布的消息)。唯一的办法是重写该代码,或删除您的触发器。不过,从上下文中不清楚是否发生了这种情况。 我使用 OUTPUT 是因为 ***.com/questions/13198476/… 推荐它作为该异常的解决方案。 即使像这样简单的事情也会引发上述异常:在 dbo.RouteSheetRecords 上创建触发器 RouteSheetRecordDatesCorrection 后插入开始更新 dbo.RouteSheetRecords SET AccomplishmentDate = SYSDATETIME(), CreationDate = SYSDATETIME() WHERE Id = (SELECT Id FROM 已插入)END GO 然后显示实际失败的语句。这不是触发器本身,而是一些外部插入/更新。还要验证表上是否还有其他触发器。 【参考方案1】:

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

【讨论】:

以上是关于修改要插入的数据的触发器不起作用(语句包含没有 INTO 子句的 OUTPUT 子句)的主要内容,如果未能解决你的问题,请参考以下文章

插入语句不起作用

怎么快速的学会SQLserver触发器,本人对数据库的查询,修改等语句是知道的。

sqlserver2005触发器问题

基本 Oracle 触发器不起作用

mysql关于触发器怎么判断数据存在时更新不存在时添加呢!

从后面的 C# 代码调用存储过程时插入语句不起作用