我继承了一个1000行的存储过程,它使用FOR XML EXPLICIT生成XML.我的问题是它大部分时间都有效.在某些情况下,我收到错误:
父标记ID 2不在打开标记中.FOR XML EXPLICIT要求首先打开父标记.检查结果集的顺序.号码:6833严重性:16状态:1
我需要有关如何排除故障的想法.我需要找出嵌套失败的地方.这可能是父行没有被发射而是子行的情况.更糟糕的是,问题只发生在我们的测试系统上,这可能会遗漏一些生产数据.问题是如何从成千上万行中找到这个?
我确信不存在一个疯狂的想法:SQL Server有一个算法,用于确定行是否按正确顺序排列.如果有一个工具可以查看我的结果集(没有FOR XML EXPLICIT)并找出问题出在哪里,那就太棒了(如果不太可能),那就告诉我吧.
如果没有这样的工具,我欢迎任何关于如何调试这个的建议.XML(当它工作时)深入四层!
更新:感谢目前为止的所有答案.看起来这是一个编辑严重的存储过程的问题.大部分用"/*/"注释注释掉- 当代码中已经有"/*/"注释时这些注释不能很好 ...当我确定答案时,我会再次更新.
一种可能的方法是实际删除FOR XML EXPLICIT部分并查看sql语句生成的结果集.它将指示生成xml的嵌套,并希望引导您解决问题.请参阅下面的图像,该图片来自MSDN文档:http: //msdn.microsoft.com/en-us/library/ms189068.aspx.

编辑
可能值得发布一个示例输出,但是在图像的示例中,如果Order!2的任何行的订单为2!Id,则会得到相同的错误.此列实际上是tag = 2的父行和tag = 3的子行之间的连接.如果您的数据如上所述,我认为您可以通过识别parent = 2和Order!2的行来有效地找到您的问题!Id为空.
或者它可以订购.在这种情况下,您可以以某种方式构建一个查询,以标识在结果集中Tag = 2的行之前发生Parent = 2的任何行.
编辑2
CREATE TABLE MyTable(
Tag int,
Parent int,
SomeIdentifier int
)
INSERT INTO MyTable VALUES (2, 1, 1) -- this row defined before parent
INSERT INTO MyTable VALUES (1, null, 1)
INSERT INTO MyTable VALUES (3, 2, 1)
INSERT INTO MyTable VALUES (3, 2, 1)
INSERT INTO MyTable VALUES (1, null, 2)
INSERT INTO MyTable VALUES (2, 1, 2)
INSERT INTO MyTable VALUES (3, 2, 2)
INSERT INTO MyTable VALUES (3, 2, 2)
INSERT INTO MyTable VALUES (1, null, 3)
INSERT INTO MyTable VALUES (3, 2, 3) -- this is orphaned
INSERT INTO MyTable VALUES (3, 2, 3) -- this is orphaned
;WITH myCte AS(
SELECT Tag
,Parent
,SomeIdentifier
,ROW_NUMBER() OVER (PARTITION BY SomeIdentifier ORDER BY(SELECT 0)) AS RowOrder
FROM MyTable
) SELECT c1.Tag
,c1.Parent
,c1.SomeIdentifier
FROM myCte c1
LEFT OUTER JOIN myCte c2 ON c2.SomeIdentifier = c1.SomeIdentifier AND c1.Parent = c2.Tag
WHERE c1.Parent IS NOT NULL --ignore root rows for now
AND (c1.RowOrder < c2.RowOrder --out of order rows
OR
c2.Tag IS NULL) --orphaned rows
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5985 次 |
| 最近记录: |