SQL 服务器触发非预期行为

问题描述 投票:0回答:1

在此表 (T_INVOICES) 中,我有一行或多行发票。此数据用于构建意大利发票的 xml 文件。有时,发票可能有两行以上具有相同描述的行(字段 2.2.1.4 - 这是该字段的 xml 名称,所以这不取决于我)。在这种情况下,我必须合并行。因此,例如,从此: 要合并的行

我必须创建两个这样的项目:

行正确合并

因为这个 marging 是手动完成的,所以我尝试通过触发器来完成。当使用 SSMS 中的 4 个 sql 语句插入行时,上面发布的这个触发器可以正常工作。但是,如果我使用 SAP 使用的 Web 服务(保存有关发票的数据的可计数系统)插入这些行,则会失败。在第二种情况下,就像触发器没有找到要更新的行一样,因为输出是:
行合并而不更新

如您所见,它从三行中创建一行,但这一行的数量为 1000,而不是 3000。我希望我现在已经清楚了。有人能帮我吗?也许有一种方法可以强制触发语句执行顺序(因为在我看来,唯一的解释是在第二种情况下它运行删除语句然后更新一个......)谢谢

sql triggers ssms
1个回答
0
投票

当你编写触发器时,如果你想管理更多行的插入/更新/删除,你必须使用触发器语句使用的两个系统表:

  • 已插入
  • 已删除

这两个表非常有用。在第一个(INSERTED)中,您已在事务中添加了所有行并更新了所有行;在第二个(已删除)中,您删除了事务中的所有行并更新了所有行(使用旧值)。

您可以在语句中使用这些表,使用 JOIN 等。

通过这种方式,您可以在同一个事务中管理多个操作。

在您的情况下,当您通过 MSSSQL 插入语句时,您会创建两个不同的事务,因为默认情况下每个 DML 操作都已通过隐式提交进行提交。

当您通过服务写入数据库时,您有一个事务(通常您使用 @Transactional 或其他类似注释来注释您的方法),因此您必须使用这些表。

© www.soinside.com 2019 - 2024. All rights reserved.