【发布时间】:2017-10-09 20:27:52
【问题描述】:
这是我们 xml 文件的一部分。
<point distanceTotal="162" seqNo="189">
<lineSection id="395" track="1" direction="1">
<outInfos>
<comment commentTypeId="4" priority="1"oneLiner="BOT">
<layerVPK seasonValue="S0"/>
<vectors>
<vector dateFrom="2016-12-11"/>
</vectors>
<frenchText>1x3 MH</frenchText>
</comment>
<comment commentTypeId="4" priority="1" oneLiner="bot">
<layerVPK seasonValue="S0"/>
<frenchText>Réception voie occupée</frenchText>
<dutchText>Test</dutchText>
</comment>
</outInfos>
</point>
我们将其上传到 SqlServer 列,并使用 XQuery 获取值。 但是,我找不到对 position() 进行编码的方法,并且基本上不能使用 T-SQL ROW_NUMBER 或密集等级,因为并非总是存在所有数据。 例如, dutchText 仅存在于第二条评论中,并且没有标识 2 cmets 的字段....
这是 SQL 代码
SELECT fi.file_uid,
fi.file_date,
T1.ref.value('@id', 'varchar(100)') AS gTV_id,
T2.ref.value('@id', 'varchar(100)') AS gTrn_id,
T4.ref.value('@seqNo', 'varchar(100)') AS gTrnTPp_seqNo,
T7.ref.value('text()[1]', 'varchar(1000)') AS gTrnTPpOiCDT_Text,
T6.ref.query('/globalTrainVariant/trains/globalTrainVariant/train/timetablePoints/point/outInfos/comment[position()]') AS Test
FROM ods.filesin fi
CROSS APPLY fi.file_xml.nodes('declare namespace cern="http://...";
(/cern:trains/globalTrainVariant)') T1(ref)
CROSS APPLY T1.ref.nodes('declare namespace cern="http://...";
(train)') T2(ref)
CROSS APPLY T2.ref.nodes('declare namespace cern="http://...";
(timetablePoints)') T3(ref)
CROSS APPLY T3.ref.nodes('declare namespace cern="http://...";
(point)') T4(ref)
CROSS APPLY T4.ref.nodes('declare namespace cern="http://...";
(outInfos)') T5(ref)
CROSS APPLY T5.ref.nodes('declare namespace cern="http://...";
(comment)') T6(ref)
CROSS APPLY T6.ref.nodes('declare namespace cern="http://...";
(dutchText)') T7(ref)
WHERE fi.file_type = 'trains'
代码没有错误,但测试字段始终为空白。
有什么建议吗?
【问题讨论】:
-
我不认为位置函数是这样工作的。此外,这显然不会正确返回位置,因为您正在尝试使用 T6 中的路径。 可能对您有用的是带有 row_number() 和外部应用的子查询,而不是交叉应用 T7(ref) 以获得正确的行号,然后排除 t7.ref 为空的那些
标签: sql-server xquery-sql