gpt4 book ai didi

sql-server - 插入中保留的文档中 XML 节点的顺序?

转载 作者:行者123 更新时间:2023-12-05 01:03:49 30 4
gpt4 key购买 nike

如果我这样做:

INSERT INTO dst
SELECT blah
FROM src
CROSS APPLY xmlcolumn.nodes('blah')

dst 有一个标识列,可以肯定地说标识列的顺序与原始 xml 文档中节点的顺序相匹配吗?

我认为答案是否定的,没有任何保证,为了确保能够保留排序,在枚举节点的同时还需要从 XML 中提取一些排序信息。

最佳答案

没有办法在执行计划中明确地看到它,但是 nodes() 方法返回的 id 列是一个 varbinary(900) OrdPath ,它确实封装了原始xml文档顺序

solution由 Mikael Eriksson 提供的相关问题 Does the `nodes()` method keep the document order?依赖 OrdPath 提供一个 ORDER BY 子句,以确定如何为 INSERT 分配标识值。

更简洁的用法如下:

CREATE TABLE #T 
(
ID integer IDENTITY,
Fruit nvarchar(10) NOT NULL
);

DECLARE @xml xml =
N'
<Fruits>
<Apple />
<Banana />
<Orange />
<Pear />
</Fruits>
';

INSERT #T
(Fruit)
SELECT
N.n.value('local-name(.)', 'nvarchar(10)')
FROM @xml.nodes('/Fruits/*') AS N (n)
ORDER BY
ROW_NUMBER() OVER (ORDER BY N.n);

SELECT
T.ID,
T.Fruit
FROM #T AS T
ORDER BY
T.ID;

db<>fiddle

目前没有以这种方式使用 OrdPath,但该技术原则上是合理的:

  1. OrdPath 反射(reflect)了文档顺序。
  2. ROW_NUMBER 计算按 OrdPath* 排序的序列值。
  3. ORDER BY 子句使用行号顺序。
  4. 根据 ORDER BY 将标识值分配给行。

需要明确的是,即使采用并行性也是如此。正如 Mikael 所说,可疑的方面是在 ROW_NUMBER 中使用 id 因为 id 没有记录为 OrdPath .


* 计划中未显示排序,但使用 TF 8607 的优化器输出包含:

ScaOp_SeqFunc row_number order[CALC:QCOL: XML Reader with XPath filter.id ASC]

关于sql-server - 插入中保留的文档中 XML 节点的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73392120/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com