Sql server SQL Server-XML加载问题

Sql server SQL Server-XML加载问题,sql-server,xml-parsing,sqlxml,Sql Server,Xml Parsing,Sqlxml,“您好,我正在尝试将XML自动加载到SQL中,最初我需要使用正确的数据集创建表。最终,我尝试获取序列号、IP地址和时区以及“从到”时间戳的所有计数值。我的XML是这样的: <response xmlns="http://www.test.com/sensor-api/v2"> <sensor-time timezone="America/New_York">2017-07-18T15:45:03-04:00</sensor-time> <stat

“您好,我正在尝试将XML自动加载到SQL中,最初我需要使用正确的数据集创建表。最终,我尝试获取序列号、IP地址和时区以及“从到”时间戳的所有计数值。我的XML是这样的:

<response xmlns="http://www.test.com/sensor-api/v2">
  <sensor-time timezone="America/New_York">2017-07-18T15:45:03-04:00</sensor-time>
  <status>
    <code>OK</code>
  </status>
  <sensor-info>
    <serial-number>Q8:80:39:60:9Z:F2</serial-number>
    <ip-address>192.167.130.18</ip-address>
    <name>Test</name>
    <group />
    <device-type>PC2 - UL</device-type>
  </sensor-info>
  <content>
    <elements>
      <element>
        <element-id>2</element-id>
        <element-name>Conf_Lower_Zone</element-name>
        <sensor-type>SINGLE_SENSOR</sensor-type>
        <data-type>ZONE</data-type>
        <from>2017-07-18T15:40:00-04:00</from>
        <to>2017-07-18T15:45:00-04:00</to>
        <resolution>ONE_MINUTE</resolution>
          <measurements>
            <measurement>
              <from>2017-07-18T15:40:00-04:00</from>
              <to>2017-07-18T15:41:00-04:00</to>
              <values>
                <value label="count">0</value>
              </values>
            </measurement>
          <measurement>
              <from>2017-07-18T15:41:00-04:00</from>
              <to>2017-07-18T15:42:00-04:00</to>
               <values>
                  <value label="count">0</value>
               </values>
          </measurement>
下面是我的SQL部分:

CREATE DATABASE OPENXMLTesting
GO

USE OPENXMLTesting
GO

CREATE TABLE XMLwithOpenXML
(
Id INT IDENTITY PRIMARY KEY,
XMLData XML,
LoadedDateTime DATETIME
)

INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK 'C:\Example\Test.xml', SINGLE_BLOB) AS x;

SELECT * FROM XMLwithOpenXML

USE OPENXMLTesting
GO

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XMLData FROM XMLwithOpenXML

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT [element-id], [element-name], [data-type], [ip-address]

FROM OPENXML(@hDoc, 
'content/elements/element/measurements/measurement/values/value')

WITH 
(   
    [element-id] varchar (100) '@ElementID',
    [element-name] varchar(50) '@Element_Name',
    [data-type] varchar(50) '@Data_Type',
    [ip-address] varchar(50) '@IP_Address'
)

EXEC sp_xml_removedocument @hDoc
GO
问题是,作为结果,我只得到标题,下面没有任何数据。请参阅下面的图片。


我做错了什么?

有两个问题

首先涉及到一个名称空间。因为它是默认名称空间,所以必须声明或通配符它

其次,所选择的使用OPENXML中的
以及创建和删除文档的两个存储过程的方法已经完全过时。您应该使用现代原生XML方法。尝试以下方法:

DECLARE@xml=
不
2017-07-18T15:45:03-04:00
OK
Q8:80:39:60:9Z:F2 192.167.130.18 试验 PC2-UL 2. 形态低区 单传感器 区 2017-07-18T15:40:00-04:00 2017-07-18T15:45:00-04:00 一分钟 2017-07-18T15:40:00-04:00 2017-07-18T15:41:00-04:00 0 2017-07-18T15:41:00-04:00 2017-07-18T15:42:00-04:00 0 ';
--查询需要声明名称空间
--我将使用直接调用来获取奇异值
--…和
.nodes()
以获取
1:n
相关元素的派生集

WITH XMLNAMESPACES(DEFAULT 'http://www.test.com/sensor-api/v2')
SELECT @xml.value('(/response/sensor-time/@timezone)[1]','nvarchar(max)') AS SensortTime_TimeZone
      ,@xml.value('(/response/sensor-time/text())[1]','datetime') AS SensortTime
      ,@xml.value('(/response/status/code/text())[1]','nvarchar(max)') AS StatusCode
      ,@xml.value('(/response/sensor-info/serial-number/text())[1]','nvarchar(max)') AS SerialNumber
      ,e.value('(element-id/text())[1]','int') AS ElementId
      ,e.value('(element-name/text())[1]','nvarchar(max)') AS ElementName
      --more from here
      ,m.value('(from/text())[1]','datetime') AS Measurement_From
      ,m.value('(to/text())[1]','datetime') AS Measurement_To
      ,m.value('(values/value/@label)[1]','nvarchar(max)') AS Measurement_Label
      ,m.value('(values/value/text())[1]','int') AS Measurement_Label
FROM @xml.nodes('/response/content/elements/element') A(e)
OUTER APPLY e.nodes('measurements/measurement') B(m);

Shnugo-我实现了你的建议,但是我仍然得到只有标题的查询,而没有任何值。@Slavisha,对于给定的示例,我得到了数据,因此XML中一定有差异…你看到了上面给出的示例中的数据吗..Shnugo,谢谢你的帮助。是的,在我刚才的示例中,你是对的xml的一个和平,但我在整个xml上运行您的mods。这给我带来了另一个问题,我必须将此加载作为自动过程,以便每当xml被放入文件夹时,SQL作业都会将其拾取并将数据追加到表中。但这意味着我必须以某种方式自动编辑“DECLARE@xml xml=N”“要始终包含放置在文件夹中的整个XML的部分。这可能吗?@Slavisha SQL Server和T-SQL可能是错误的工具。是的,这是可能的,但我更喜欢使用更合适的工具,如C#或任何其他您知道的语言。我将创建一个windows服务,它定期检查文件夹并从光盘中读取XML。您可以按原样将XML传递给存储过程,并使用上面的方法从中读取。或者可以使用C#的功能进入XML并传递裸数据。SQL Server在从光盘读取数据方面非常有限(例如,编码非常有限…)Shnugo,感谢您的帮助。在你上次的评论中,我对建议做了数小时的研究。我能够使用SSIS包将XML加载到Sql表中,方法是使用合并连接过程,在该过程中,我将XML的每个元素与其键连接起来。最后的和平是添加传感器信息数据,将该数据与其余数据进行拼接,我似乎无法实现这一点。您知道SSIS包中的哪个过程可以让我添加传感器信息数据,以便在其余数据的每一行中重复该过程吗?问题是我没有传感器信息和其余数据之间的唯一键。