sql-server - 从根元素 xml 获取值到列

标签 sql-server xml tsql

添加根元素时出现问题。 使用 mssql 服务器 2017。 XML 示例:

DECLARE @XML XML = '
<FileId global_id="1234">
  <file id="12aa"><vd>3</vd>
    <pl_a type_a ="111" k="111" name="aaa"></pl_a>
    <period from="2019-04-01" to="2019-06-30"></period>
    <all>1</all>
  </file>
  <file id="12bb"><vd>3</vd>
    <pl_b type_b ="222" k="222" name="bbb"></pl_b>
    <period from="2019-04-01" to="2019-06-30"></period>
    <all>2</all>
  </file>
</FileId>'

我试过这个查询:

SELECT F.[File].value(N'@global_id','varchar(100)') as id_payment,
       F.[File].value('@id', 'varchar(4)') AS id,
       ISNULL(F.[File].value('(pl_a/@type_a)[1]', 'int'), F.[File].value('(pl_b/@type_a)[1]', 'int')) AS type_a,
       ISNULL(F.[File].value('(pl_a/@type_b)[1]', 'int'), F.[File].value('(pl_b/@type_b)[1]', 'int')) AS type_b,
       ISNULL(F.[File].value('(pl_a/@k)[1]', 'int'), F.[File].value('(pl_b/@k)[1]', 'int')) AS k,
       ISNULL(F.[File].value('(pl_a/@name)[1]', 'varchar(4)'), F.[File].value('(pl_b/@name)[1]', 'varchar(4)')) AS [name],
       F.[File].value('(period/@from)[1]', 'date') AS [date_from],
       F.[File].value('(period/@to)[1]', 'date') AS [date_from],
       F.[File].value('(all/text())[1]', 'int') AS [all]
FROM (VALUES (@XML)) V (X)
     CROSS APPLY V.X.nodes('/FileId/file') F([File]);

但是查询没有得到根值。

预期:

global_id id   type_a      type_b      k           name date_from  date_from  all
--------- ---- ----------- ----------- ----------- ---- ---------- ---------- -----------
1234      12aa 111         NULL        111         aaa  2019-04-01 2019-06-30 1
1234      12bb NULL        222         222         bbb  2019-04-01 2019-06-30 2

实际:

global_id id   type_a      type_b      k           name date_from  date_from  all
--------- ---- ----------- ----------- ----------- ---- ---------- ---------- -----------
NULL      12aa 111         NULL        111         aaa  2019-04-01 2019-06-30 1
NULL      12bb NULL        222         222         bbb  2019-04-01 2019-06-30 2

最佳答案

改变这个:

SELECT F.[File].value(N'@global_id','varchar(100)') as id_payment

对此:

SELECT V.X.value(N'(/FileId/@global_id)[1]','varchar(100)') as id_payment

关于sql-server - 从根元素 xml 获取值到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58625601/

相关文章:

sql - 在 HAVING 子句中重用计算列

sql - 如何提高 SSMS 中 SQL 查询的执行时间?

sql - PIVOTing可变数量的行到列

c# - 如何从 SQL to Linq 中的存储过程中进行选择

Java 使用 SAX 解析读取 XML

xml - 如何在 XML 中隐藏 GtkSpinButton

java - 获取没有 XML 根 JAXB 的多个元素

sql - nvarchar 在存储过程中限制为 8000 个字符

sql-server - 生成标志以检查连接条件是否匹配 - SQL Server

sql - 使用拥有规则的多个分隔符(和 - )拆分 sql 中的数据