如果语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句不能有任何启用的触发器

Posted

技术标签:

【中文标题】如果语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句不能有任何启用的触发器【英文标题】:DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause 【发布时间】:2020-01-09 10:49:01 【问题描述】:

我一直未能成功地搜索 *** 和其他网站来解决我的错误,所以有时间发帖看看是否有人能告诉我哪里出错了。

我的系统有一个表单简单的 PowerApp。保存表单时,字段将写入 table1。然后我想在 table1 上创建一个触发器,以便将每个新记录中的一个字段插入到 table2 中。

尽管我的代码中没有输出子句,但我收到以下错误:

请求的操作无效。服务器响应:Microsoft SQL:如果该语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句的目标表“table1”不能有任何启用的触发器。内部异常:Microsoft SQL:如果该语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句的目标表“table1”不能有任何启用的触发器。

将我的代码剥离回以下仍然会引发相同的错误:

ALTER TRIGGER [dbo].[FormatID] 
   ON  [dbo].[table1]
   AFTER INSERT
AS 
BEGIN

    INSERT INTO [dbo].[table2](origID) 
    VALUES (1)

END

任何建议请开火,我觉得我好像遗漏了一些明显的东西......

【问题讨论】:

错误在这里告诉你问题;你无法解决这个问题。您最好告诉我们您实际上想要达到的目标。 听起来您的表单背后的代码只是使用output 返回结果集而不是output ... into 将其存储在@table 变量、#temp 或##temp 表中,或持久化桌子。和Cannot use UPDATE with OUTPUT clause when a trigger is on the table基本一样的问题和解决方法 嘿@AlwaysLearning 感谢您的回复。您是说尽管我不使用 OUTPUT 或 INSERTED 等,但我需要适应该结果集并将其存储在某个地方?我之前看过那个链接,但与大多数例子一样,这个人正在使用 INSERTED 或 DELETED 而我没有。也许我对我的编码和对它的理解过于直白了...... 在 Power Apps 中使用存储过程而不是插入行组件。因为这会将 OUTPUT 子句附加到 INSERT,如此处所述 powerusers.microsoft.com/t5/Connecting-To-Data/… @MartinSmith 非常感谢,这让我免于头疼。 【参考方案1】:

您的应用程序正在输出 dml 语句的插入/删除值作为结果集。当表(dml 的目标)上有触发器时,这是不可能的

create table dbo.table1(id int);
create table dbo.table2(origID int);
go

CREATE OR ALTER TRIGGER [dbo].[FormatID] 
   ON  [dbo].[table1]
   AFTER INSERT
AS 
BEGIN

    INSERT INTO [dbo].[table2](origID) 
    VALUES (1)

END;


--succeeds
insert into dbo.table1(id) 
values (1);
go

--fails
insert into dbo.table1(id) 
output inserted.id --output cannot be a resultset(in the void) because there is a trigger
values(1);

--succeeds
declare @outputtable table (id int);
insert into dbo.table1(id) 
output inserted.id into @outputtable(id)--output into a table
values(1);

【讨论】:

嗨@lptr 感谢您的回复,我已经在我的机器上运行了您的示例并且还有一个问题:) 好的,所以我的困惑是为什么第一个“插入”成功尽管不适应输出结果集是否像您示例中的第三个? @PeaceAndJam:如果 table1 没有触发器,则所有 3 个语句都成功。如果 table1 有触发器,则第二条语句失败(因为当目标表有触发器时,输出必须引导到容器/表中) ...并且第一个语句不使用/没有输出,所以它总是成功。 嘿@lptr 感谢您的耐心:) 这就是为什么我无法理解我的问题:我的触发器不使用输出子句,所以我不明白为什么插入 table1 时会抛出错误通过 PowerApp。当我运行您提供的示例时,它可以工作,但它全部在 SSMS 中......我想知道来自 PowerApps 表单的插入是否有一些时髦? 我认为上面 cmets 中的 Martin Smith 已经确认这是 PowerApps 的限制。感谢您的时间@lptr!非常感谢。

以上是关于如果语句包含没有 INTO 子句的 OUTPUT 子句,则 DML 语句不能有任何启用的触发器的主要内容,如果未能解决你的问题,请参考以下文章

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

OUTPUT INTO 子句中可以使用哪些列?

SQL语法 之 操作语句

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

使用 OUTPUT 子句从 SELECT INSERT 语句中检索原始身份和新身份映射

如何修复此 SELECT 语句中的错误 INTO 子句