【问题标题】:Can't get result from parsing XML in SQL Server 2014 using sp_xml_preparedocument and OPENXML无法使用 sp_xml_preparedocument 和 OPENXML 在 SQL Server 2014 中解析 XML 获得结果
【发布时间】:2017-09-07 09:13:10
【问题描述】:

我有以下 XML,我正在尝试使用 sp_xml_preparedocument 和 OPENXML 从中选择某些数据,但我没有得到任何结果:

DECLARE @hDoc AS INT
        ,@XML xml = '<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="MapSource 6.15.6" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
  <metadata>
    <link href="http://www.garmin.com">
      <text>Garmin International</text>
    </link>
    <time>2013-06-25T13:37:18Z</time>
    <bounds maxlat="42.3806126" maxlon="27.7387079" minlat="42.3448138" minlon="27.7156218" />
  </metadata>
  <trk>
    <name>ACTIVE LOG 033</name>
    <extensions>
      <gpxx:TrackExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
        <gpxx:DisplayColor>White</gpxx:DisplayColor>
      </gpxx:TrackExtension>
    </extensions>
    <trkseg>
      <trkpt lat="42.3806126" lon="27.7234045">
        <time>2013-06-25T06:44:31Z</time>
        <extensions>
          <gpxx:TrackPointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
            <gpxx:Temperature>24.2592182</gpxx:Temperature>
            <gpxx:Depth>19.8200226</gpxx:Depth>
          </gpxx:TrackPointExtension>
        </extensions>
      </trkpt>
      <trkpt lat="42.3802007" lon="27.7237631">
        <time>2013-06-25T06:44:48Z</time>
        <extensions>
          <gpxx:TrackPointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
            <gpxx:Temperature>24.2816105</gpxx:Temperature>
            <gpxx:Depth>19.1851730</gpxx:Depth>
          </gpxx:TrackPointExtension>
        </extensions>
      </trkpt>
      <trkpt lat="42.3798285" lon="27.7240684">
        <time>2013-06-25T06:45:03Z</time>
        <extensions>
          <gpxx:TrackPointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
            <gpxx:Temperature>24.2928104</gpxx:Temperature>
            <gpxx:Depth>18.4135780</gpxx:Depth>
          </gpxx:TrackPointExtension>
        </extensions>
      </trkpt>
    </trkseg>
  </trk>
</gpx>'

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,'<root xmlns:a="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"/>'

SELECT GPSName, GPSLat, GPSLon, GPSTime, GPSTemp, GPSDepth
FROM OPENXML(@hDoc, 'gpx/trk/trkseg/trkpt/extensions/gpxx:TrackPointExtension')
WITH 
(
GPSName [varchar](100) '../../name'
,GPSLat decimal(18,7) '../../../../@lat'
,GPSLon decimal(18,7) '../../../../@lon'
,GPSTime datetime '../../../../time'
,GPSTemp decimal(18,7) '/gpxx:Temperature'
,GPSDepth decimal(18,7) '/gpxx:Depth'
)

EXEC sp_xml_removedocument @hDoc

使用上面我得到 Null(零行)。你能帮我理解我做错了什么吗?以及如何正确获取数据?

刚刚对 SELECT 语句进行了更改:

SELECT GPSName, GPSLat, GPSLon, GPSTime, GPSTemp, GPSDepth
FROM OPENXML(@hDoc, 'a:gpx/a:trk/a:trkseg/a:trkpt/a:extensions/gpxx:TrackPointExtension',1)
WITH 
(
GPSName [varchar](100) '../../name'
,GPSLat decimal(18,7) '../../../../@lat'
,GPSLon decimal(18,7) '../../../../@lon'
,GPSTime datetime '../../../../time'
,GPSTemp decimal(18,7) '/gpxx:Temperature'
,GPSDepth decimal(18,7) '/gpxx:Depth'
)

现在我返回了行,但那里仍然只有 NULL 值:

GPSName                        GPSLat       GPSLon       GPSTime        GPSTemp        GPSDepth
------------------------------ ------------ ------------ -------------- -------------- ----------------
NULL                           NULL         NULL         NULL           NULL           NULL
NULL                           NULL         NULL         NULL           NULL           NULL
NULL                           NULL         NULL         NULL           NULL           NULL

(3 row(s) affected)

【问题讨论】:

  • 是的,我做的或多或少是一样的,谢谢,但是 XML 要复杂得多(具有不同深度的命名空间、属性和值),显然还有更多的东西要申请正确的结果...

标签: sql-server xml tsql


【解决方案1】:

以下查询会有所帮助(供参考)。

DECLARE @DocHandle INT,
        @Xml NVARCHAR(MAX)
SET @XMl = N'<root><Salary>0.00</Salary></root>'
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @Xml

SELECT CASE WHEN Salary <> 0 THEN Salary ELSE 10000 END AS Salary
FROM OPENXML (@DocHandle , '/root')
WITH (Salary DECIMAL(18,3), 'Salary')

输出:

Salary
--------
10000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多