【发布时间】:2012-09-14 07:07:18
【问题描述】:
我有一个触发器,它使用同一插入记录的身份主键 (MessageId) 的值更新插入的字段 (RootId) 之一。仅当插入记录的 RootId 字段为 0 时才应进行更新。 触发器如下所示:
ALTER TRIGGER [dbo].[Trigger_RootIdUpdate]
ON [dbo].[Messages]
AFTER INSERT
AS BEGIN
SET NOCOUNT ON;
DECLARE @MessageId Int
SELECT @MessageId = I.MessageId
FROM INSERTED I
UPDATE Messages
SET RootId = @MessageId
WHERE MessageId = @MessageId AND MessageId = 0
END
我在 Azure 中使用它,当我插入一行时,它给了我以下错误:
DML 语句的目标表 'dbo.Messagess' 不能有任何 如果语句包含 OUTPUT 子句,则启用触发器 INTO 子句。
相同的触发器适用于我真正的 MS SQL 2012。我认为设置有所不同,但我不明白它试图告诉我什么。
我是不是把事情复杂化了? 谢谢!
【问题讨论】:
-
请显示包含
OUTPUT子句的语句。我之前在 SQL Server 2008 上看到过该错误,不得不求助于OUTPUT INTO @tablevar,然后从表变量中进行选择。 -
由于这个错误,我在 2008 R2 中也将
OUTPUT INTO @tablevar用于防御目的(如果有人创建触发器)。不过,我只输出主键,然后在选择时加入@tablevar,因为它不适用于所有数据类型 IIRC。 -
该错误是由 Azure/Silverlight 表编辑器生成的。我假设当我在那里编辑一行时,Azure 会生成一个 T-SQL 语句,其中包括没有 INTO 的 OUTPUT。使用 C#/LINQ 代码更新行有效。
-
附带说明,我不确定它是否会正常工作,即如果插入了多行(插入...从其他地方选择),则插入的项目包含多条记录。 Inserted 将包含多条记录,并且可能只是将第一条记录提取到您的变量中(如果它确实有效)。而是加入 INSERTED 和 Messages 以实现更新,