Sql server SQL Server ChangeTable返回插入的行,这些行不包含';还不存在

Sql server SQL Server ChangeTable返回插入的行,这些行不包含';还不存在,sql-server,Sql Server,我正在使用SQL Server 2014的更改跟踪功能将我的应用程序的内部状态与数据库同步,但遇到了一些意外行为 我当前的存储过程基于以下MSDN示例: 似乎发生的是SYS_CHANGE_操作是一个带有主键的insert的“I”,但如果我与实际表联接,则那里还没有数据-更改表上的主键已设置,但表本身和所有其他列上的主键均为null 对于我认为不可能的情况,这会导致应用程序端出现一些解析错误?如果数据尚未插入,它肯定不应该报告插入 我的事务隔离级别是读取提交的,并按照MSDN的建议启用了快照隔离和

我正在使用SQL Server 2014的更改跟踪功能将我的应用程序的内部状态与数据库同步,但遇到了一些意外行为

我当前的存储过程基于以下MSDN示例:

似乎发生的是SYS_CHANGE_操作是一个带有主键的insert的“I”,但如果我与实际表联接,则那里还没有数据-更改表上的主键已设置,但表本身和所有其他列上的主键均为null

对于我认为不可能的情况,这会导致应用程序端出现一些解析错误?如果数据尚未插入,它肯定不应该报告插入


我的事务隔离级别是读取提交的,并按照MSDN的建议启用了快照隔离和读取提交的快照。

结果表明,这不是更改跟踪的问题,而是对另一个表执行内部联接,然后对changetable执行外部联接的结果

在这种情况下,内部联接没有返回任何行(另一个表中缺少外键),而与changetable的外部联接导致了问题中所述的“空”插入(除change table列之外的所有列均为null)

解决方案是保留查询,但添加一个额外的where约束:

WHERE MY.PrimaryKey IS NOT NULL OR CT.SYS_CHANGE_OPERATION = 'D'
这确保了在发生插入或更新时主键不为null,并假设应用程序能够容忍没有发生先前插入的更新,因为我们基本上是过滤掉插入并等待内部连接成功的后续更新