【发布时间】:2014-04-11 08:15:37
【问题描述】:
我有一个包含后续列的表变量:
[ID] TINYINT
[XML] XML
XML 结构如下所示:
<conditions>
<condition type='expresion'>
...
</condition>
<condition type='operand'>
...
</condition>
<condition type='expresion'>
...
</condition>
<condition type='operand'>
...
</condition>
<condition type='expresion'>
...
</condition>
</conditions>
我需要提取上面的信息并使用以下结构填充表格:
[ID]
[ConditionID]
[ConditionXML]
其中ConditionID 将是数字列,ConditonXML 将从原始XML 中提取。
对我来说非常重要的是生成ConditionID 值以表示原始XML 结构中的顺序。
我have read 认为这可以使用ROW_NUMBER 来完成,如下所示:
SELECT [ID]
,ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY T.c) AS T
,T.c.query('.')
FROM @Test
CROSS APPLY [CondtionsXML].nodes('conditions/condition') T(c)
ORDER BY [ID], T
但是在official documentation 中是这样说的:
无法保证查询返回的行使用 ROW_NUMBER() 的顺序将与每次执行完全相同 除非满足以下条件:
- 分区列的值是唯一的。
- ORDER BY 列的值是唯一的。
- 分区列和 ORDER BY 列的值的组合 是独一无二的。
由于我的operand 节点可能相同,我担心我可能会遇到一些问题。另外,如果我删除 PARTITON BY 子句,事情就会出错。
我可以使用的其他方法是使用 INDENTITY 列创建一个单独的故事,并像这样将值插入其中:
DECLARE @TEST1 TABLE
(
[ID] SMALLINT IDENTITY(1,1)
,[ParentID] TINYINT
,[XML] XML
)
INSERT INTO @TEST1 ([ParentID], [XML])
SELECT [ID]
,T.c.query('.')
FROM @Test
CROSS APPLY [CondtionsXML].nodes('conditions/condition') T(c)
谁能说这是否是按照XML 结构器中表示的顺序在表中插入XML 节点的方法。
【问题讨论】:
标签: sql-server xml tsql sql-server-2012 nodes