小编Ben*_*ius的帖子

为什么查询违反外键的记录会返回错误的结果?

在添加新外键之前对表进行一些预检查时,我们正在查询当前有多少行会违反新键。这是一个相当活跃的数据库,在有问题的表上有近乎恒定的插入。

FK 将从 MessagePatientIdentifier.MessageID 到 Message.MessageID。

我们使用的查询非常简单:

select * from MessagePatientIdentifier as mpi
where
    MessageID not in (select MessageID from Message)
Run Code Online (Sandbox Code Playgroud)

我们看到的问题是从 MessagePatientIdentifier 返回行

MessagePatientID                     | MessageID 
553bde76-47d4-4ec3-96d1-b5d2e98931e1 | 7d45464d-8cc4-4a2e-8828-020722165b39

Run Code Online (Sandbox Code Playgroud)

在这种情况下,当您然后时select * from Message where MessageID = 7d45464d-8cc4-4a2e-8828-020722165b39,该记录确实存在。

然后,我们继续前行,并试图相同的查询,但在一个表DOES有FK的地方,以同样的方式引用信息表。相同的结果...查询报告存在子表记录,而没有父表对应的父表(消息)记录。

MessageRecipID                       | MessageID 
26d6d632-87b3-407e-aeb0-04552981e5f8 | 750f0fb4-3e6c-485d-996e-f061f8caa360

Run Code Online (Sandbox Code Playgroud)

然后,如果你再次select * from Message where MessageID = 750f0fb4-3e6c-485d-996e-f061f8caa360,这将返回记录。

这些数据来自 Mirth Server 的存储过程以及 BizTalk WCF-SQL 发送端口。proc 插入消息记录,获取 newuniqueidentifier作为输出变量,然后使用它来调用辅助存储过程以插入MessagePatient.MessageIDMessageRecip.MessageID

这是预期的行为吗,我只是没有了解 SQL 的内部工作原理?从技术上讲,我相信 BizTalk 会在事务中运行所有内容,因此它不应该不同步,即使它做了,如果不是从消息插入中获取 MessageID …

foreign-key stored-procedures uniqueidentifier sql-server-2012

4
推荐指数
1
解决办法
85
查看次数