PowerApp关联SQL触发器报错:无INTO的OUTPUT子句触发限制
解决PowerApp+SQL Server触发器的OUTPUT子句报错问题
我刚碰到过几乎一模一样的问题,你的报错根源其实不在你写的触发器代码里——是PowerApp默认的表单提交逻辑在搞事情!
当你用PowerApp的SubmitForm函数向SQL Server的table1插入数据时,PowerApp会自动在生成的SQL语句里加上OUTPUT子句(用来返回刚插入的记录),但SQL Server有个硬性规则:如果目标表(这里就是table1)有启用的触发器,那么带有OUTPUT但没有INTO子句的DML语句是不允许执行的,这就是你看到那个报错的原因。哪怕你的触发器里只有最简单的INSERT操作,这个限制依然会触发。
下面给你两个最实用的解决办法,选哪个看你的需求:
方法1:改用Patch函数提交数据(推荐,最简单)
如果你的业务不需要PowerApp返回刚插入的记录,直接把SubmitForm换成Patch函数就行,Patch不会自动添加OUTPUT子句,完美避开这个限制。示例代码如下:
Patch(table1, Defaults(table1), { // 把这里替换成你的表单字段和数据源字段的映射 字段1: YourFormName.字段1.Value, 字段2: YourFormName.字段2.Text, // 其他字段依次类推 })
替换完之后,你的原触发器FormatID就能正常工作了,新记录插入table1后,触发器会自动把数据写入table2。
方法2:修改SQL Server触发器为INSTEAD OF类型
如果必须保留SubmitForm的逻辑(比如需要返回插入后的记录),可以把你的AFTER触发器改成INSTEAD OF触发器,手动完成两次插入操作:
ALTER TRIGGER [dbo].[FormatID] ON [dbo].[table1] INSTEAD OF INSERT AS BEGIN -- 第一步:把新数据插入到table1本身 INSERT INTO [dbo].[table1] (字段1, 字段2, 字段3) -- 列出table1所有需要插入的字段(排除自增ID等自动生成字段) SELECT 字段1, 字段2, 字段3 -- 对应inserted表的字段 FROM inserted; -- 第二步:把需要的字段插入到table2 INSERT INTO [dbo].[table2](origID) SELECT inserted.ID -- 这里可以换成你实际需要的字段,比如inserted里的某个值 FROM inserted; END
注意:INSTEAD OF触发器会完全替代原来的INSERT操作,所以一定要确保你在触发器里把inserted表的所有必要字段都插入到table1,不然会丢失数据。
我当时用的是方法1,改完代码后触发器立刻正常工作了,你可以先试试这个方案。
内容的提问来源于stack exchange,提问作者PeaceAndJam
相关产品推荐
相关产品推荐

