插入操作中XML文档节点顺序能否与Identity列顺序保持一致?
问题解答
不能保证dst表的identity列顺序与原XML文档中的节点顺序完全一致。
SQL Server处理CROSS APPLY xmlcolumn.nodes('blah')时,即便多数情况下节点会按XML中的顺序返回,但官方并未承诺这种顺序会被严格保障。当查询优化器选择不同执行计划(比如启用并行执行)时,返回行的顺序可能发生偏移,导致identity列生成的值无法对应原XML的节点顺序。
如果需要严格保留XML节点的原始顺序,必须从XML中提取明确的排序信息。比如利用XML节点的位置生成序号,再以此序号作为插入时的排序依据,示例代码如下:
INSERT INTO dst (blah, node_sequence) SELECT x.n.value('(./text())[1]', 'varchar(100)') AS blah, -- 获取节点在父节点中的位置序号 x.n.value('for $i in . return count(../*[. << $i]) + 1', 'int') AS node_sequence FROM src CROSS APPLY xmlcolumn.nodes('blah') AS x(n) ORDER BY node_sequence;
通过显式的排序字段控制插入顺序,才能确保最终identity列的顺序与原XML节点顺序一致。
内容的提问来源于stack exchange,提问作者Cade Roux
相关产品推荐
相关产品推荐

