sql-server - 从 SQL Server 中的 xml 字段中选择日期列表

标签 sql-server xml attributes xquery sql-server-2017

我正在尝试从以下 XML 中选择日期:

<output xmlns="http://www.abcde.com/pqwlv/dwh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="46177" xsi:schemaLocation="dwhOutput.xsd">
  <parameter>
    <isCoupon>0</isCoupon>
  </parameter>
  <schedule>
    <executionDate businessDay="2020-01-09">2020-01-09</executionDate>
    <endDates>
      <item businessDay="2019-03-18">2019-03-17</item>
      <item businessDay="2019-06-17">2019-06-17</item>
      <item businessDay="2019-09-17">2019-09-17</item>
      <item businessDay="2019-12-17">2019-12-17</item>
      <item businessDay="2020-03-17">2020-03-17</item>
      <item businessDay="2020-06-17">2020-06-17</item>
    </endDates>
  </schedule>
</output>

我想从“endDates”字段中选择日期列表(“businessDay”),因此输出将是(作为表格):

endDates
----------
2019-03-18
2019-06-17
2019-09-17
2019-12-17
2020-03-17
2020-06-17

我试过使用这个查询:

SELECT endDates.query('.') AS endDates
FROM [table]
CROSS APPLY
OUTPUT.nodes('declare namespace ns="http://www.abcde.com/pqwlv/dwh"; /ns:output/ns:schedule/ns:endDates') AS T1(endDates) 

得到:

<p1:endDates xmlns:p1="http://www.abcde.com/pqwlv/dwh">
  <p1:item businessDay="2019-03-18">2019-03-17</p1:item>
  <p1:item businessDay="2019-06-17">2019-06-17</p1:item>
  <p1:item businessDay="2019-09-17">2019-09-17</p1:item>
  <p1:item businessDay="2019-12-17">2019-12-17</p1:item>
  <p1:item businessDay="2020-03-17">2020-03-17</p1:item>
  <p1:item businessDay="2020-06-17">2020-06-17</p1:item>
</p1:endDates>

如何深入挖掘并选择日期?

最佳答案

你离得不远。您需要在查询开始时使用 WITH XMLNAMESPACES 来定义 namespace ,然后您可以遍历 FROM 中的节点:

DECLARE @xml xml = '<output xmlns="http://www.abcde.com/pqwlv/dwh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="46177" xsi:schemaLocation="dwhOutput.xsd">
  <parameter>
    <isCoupon>0</isCoupon>
  </parameter>
  <schedule>
    <executionDate businessDay="2020-01-09">2020-01-09</executionDate>
    <endDates>
      <item businessDay="2019-03-18">2019-03-17</item>
      <item businessDay="2019-06-17">2019-06-17</item>
      <item businessDay="2019-09-17">2019-09-17</item>
      <item businessDay="2019-12-17">2019-12-17</item>
      <item businessDay="2020-03-17">2020-03-17</item>
      <item businessDay="2020-06-17">2020-06-17</item>
    </endDates>
  </schedule>
</output>';

WITH XMLNAMESPACES(DEFAULT 'http://www.abcde.com/pqwlv/dwh',
                   'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT eD.item.value('@businessDay','date') AS endDate
FROM (VALUES(@XML))V(YourXML) --This would be your table
     CROSS APPLY V.YourXML.nodes('/output/schedule/endDates/item') eD(item);

关于sql-server - 从 SQL Server 中的 xml 字段中选择日期列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59731465/

相关文章:

sql-server - SSMS Microsoft SQL Server Management Studio 中的重复滚动条导致显示损坏

java - 从 xsl :fo 生成 html xslt

java - StAX 与 JAXB XML 解析 仅解析第一个实例

java - LDAP+ Java : How can I know my active directory's names

.net - 使用标记接口(interface)而不是属性的令人信服的理由

sql - 删除 SQL 中一对元素的顶行

sql - 月末时如何按月分组

sql - 如何从 GetDate() 获取时间部分 As hh :mm tt in SQL Server

.net - 在 SOAP 调用中查看 xml 请求

python - Python 中的 __set__ 和 __setattr__ 有什么区别,应该在什么时候使用?