【问题标题】:Statement contains an OUTPUT clause without INTO clause error语句包含没有 INTO 子句错误的 OUTPUT 子句
【发布时间】: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 以实现更新,

标签: sql azure


【解决方案1】:

我认为这可能与 Anthony Horne 所写的有关。

这行得通吗?

ALTER TRIGGER [dbo].[Trigger_RootIdUpdate] 
  ON  [dbo].[Messages] 
  AFTER INSERT
AS BEGIN
  UPDATE 
    Messages
  SET 
    Messages.RootId = INSERTED.MessageId 
  FROM Messages Msg
  JOIN INSERTED ON 
    Msg.MessageId = INSERTED.MessageId 
  WHERE 
    Msg.MessageId = INSERTED.MessageId 
    AND INSERTED.RootId = 0;
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多