【问题标题】:SQL Server query XML structureSQL Server 查询 XML 结构
【发布时间】:2020-04-29 18:30:50
【问题描述】:

我有一个这样的 xml:

<?xml version="1.0"?>
<ArrayOfFMADevice>

   <DeviceID xmlns="http://www.fmaudit.com/">72979</DeviceID>
    <CreationDate xmlns="http://www.fmaudit.com/">2017-04-12T02:13:44.257</CreationDate>
    <Manufacturer xmlns="http://www.fmaudit.com/">RICOH</Manufacturer>
    <Model xmlns="http://www.fmaudit.com/">MP C2004</Model>
      <FMAMeter Version="4.4.85.17052">
        <Date>2020-04-24T08:06:13.26</Date>
        <Name>PageCountTotal</Name>
        <Value>6193</Value>
      </FMAMeter>
      <FMAMeter Version="4.4.85.17052">
        <Date>2020-04-24T08:06:13.26</Date>
        <Name>PageCountMono</Name>
        <Value>3159</Value>
      </FMAMeter>
      <FMAMeter Version="4.4.85.17052">
        <Date>2020-04-24T08:06:13.26</Date>
        <Name>PageCountPrinter</Name>
        <Value>4919</Value>
      </FMAMeter>
</FMADevice>
</ArrayOfFMADevice>

我需要这种格式的记录:

DeviceID ||CreationDate || Manufacturer || Model ||  Date || PageCountTotal ||   PageCountMono ||  PageCountPrinter

有人可以指导吗?

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 到目前为止你尝试过什么??
  • 请阅读this,了解一些改进问题的技巧。

标签: sql-server xml tsql xquery


【解决方案1】:

XML 格式不正确。我必须修复它。

您并没有真正根据实际 XML 共享所需的输出。请编辑您的原始帖子并提供真正想要的输出。

同时,请尝试以下 SQL。它会给你一个良好的开端。

SQL

-- DDL and sample data population, start
DECLARE @xml XML = N'<?xml version="1.0"?>
<ArrayOfFMADevice>
    <FMADevice>
        <DeviceID xmlns="http://www.fmaudit.com/">72979</DeviceID>
        <CreationDate xmlns="http://www.fmaudit.com/">2017-04-12T02:13:44.257</CreationDate>
        <Manufacturer xmlns="http://www.fmaudit.com/">RICOH</Manufacturer>
        <Model xmlns="http://www.fmaudit.com/">MP C2004</Model>
        <FMAMeter Version="4.4.85.17052">
            <Date>2020-04-24T08:06:13.26</Date>
            <Name>PageCountTotal</Name>
            <Value>6193</Value>
        </FMAMeter>
        <FMAMeter Version="4.4.85.17052">
            <Date>2020-04-24T08:06:13.26</Date>
            <Name>PageCountMono</Name>
            <Value>3159</Value>
        </FMAMeter>
        <FMAMeter Version="4.4.85.17052">
            <Date>2020-04-24T08:06:13.26</Date>
            <Name>PageCountPrinter</Name>
            <Value>4919</Value> 
        </FMAMeter>
    </FMADevice>
</ArrayOfFMADevice>';
-- DDL and sample data population, end

;WITH XMLNAMESPACES ('http://www.fmaudit.com/' AS ns1)
SELECT header.c.value('(ns1:DeviceID/text())[1]','VARCHAR(20)') AS [DeviceID]
    , header.c.value('(ns1:CreationDate/text())[1]','DATETIME') AS [CreationDate]
    , header.c.value('(ns1:Manufacturer/text())[1]','VARCHAR(20)') AS [Manufacturer]
    , header.c.value('(ns1:Model/text())[1]','VARCHAR(20)') AS [Model]
    , body.c.value('(Date/text())[1]','DATETIME') AS [Date]
    , body.c.value('(Name/text())[1]','VARCHAR(20)') AS [Name]
    , body.c.value('(Value/text())[1]','VARCHAR(20)') AS [Value]
FROM @xml.nodes('/ArrayOfFMADevice/FMADevice') AS header(c)
    CROSS APPLY header.c.nodes('FMAMeter') AS body(c);

输出

+----------+-------------------------+--------------+----------+-------------------------+------------------+-------+
| DeviceID |      CreationDate       | Manufacturer |  Model   |          Date           |       Name       | Value |
+----------+-------------------------+--------------+----------+-------------------------+------------------+-------+
|    72979 | 2017-04-12 02:13:44.257 | RICOH        | MP C2004 | 2020-04-24 08:06:13.260 | PageCountTotal   |  6193 |
|    72979 | 2017-04-12 02:13:44.257 | RICOH        | MP C2004 | 2020-04-24 08:06:13.260 | PageCountMono    |  3159 |
|    72979 | 2017-04-12 02:13:44.257 | RICOH        | MP C2004 | 2020-04-24 08:06:13.260 | PageCountPrinter |  4919 |
+----------+-------------------------+--------------+----------+-------------------------+------------------+-------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多