Sql 将不规则xml文件传递到存储过程

Sql 将不规则xml文件传递到存储过程,sql,sql-server,xml,stored-procedures,Sql,Sql Server,Xml,Stored Procedures,我有一个示例xml,如下所示。我试图获取所有或特定的数据,然后插入到MySQL表中,该表具有表示来自xml的值的相同列。我查看了一些解决方案,但xml文件的格式与这里不同。你能帮我吗 <?xml version="1.0" encoding="UTF-8" standalone="true"?> <VehicleStatusResponse xmlns:ns2= "http://fms-standard.com/rfms/v1.0.0/xsd/common/positi

我有一个示例xml,如下所示。我试图获取所有或特定的数据,然后插入到MySQL表中,该表具有表示来自xml的值的相同列。我查看了一些解决方案,但xml文件的格式与这里不同。你能帮我吗

<?xml version="1.0" encoding="UTF-8" standalone="true"?> 
<VehicleStatusResponse xmlns:ns2= 
  "http://fms-standard.com/rfms/v1.0.0/xsd/common/position" xmlns="http://fms-standard.com/rfms/v1.0.0/xsd/status"> 
<VehicleStatus> 
       <VIN>VF254ANA735752628</VIN> 
       <TriggerType>TIMER</TriggerType> 
       <CreatedDateTime>2014-09-08T09:30:20</CreatedDateTime> 
       <ReceivedDateTime>2014-09-08T09:30:57</ReceivedDateTime> 
       <GNSSPosition> 
              <ns2:Latitude>49.18557</ns2:Latitude> 
              <ns2:Longitude>11.18557</ns2:Longitude> 
              <ns2:Heading>33</ns2:Heading> 
              <ns2:Altitude>500</ns2:Altitude> 
              <ns2:Speed>16.4</ns2:Speed> 
              <ns2:PositionDateTime>2014-09-08T09:30:20</ns2:PositionDateTime> 
       </GNSSPosition> 
       <WheelBasedSpeed>16.07</WheelBasedSpeed> 
       <TachographSpeed>15.83</TachographSpeed> 
       <HRTotalVehicleDistance>817.5</HRTotalVehicleDistance> 
       <EngineTotalFuelUsed>575</EngineTotalFuelUsed> 
       <FuelLevel1>83</FuelLevel1> 
       <CatalystFuelLevel>88.48</CatalystFuelLevel> 
       <GrossCombinationVehicleWeight>10000</GrossCombinationVehicleWeight> 
</VehicleStatus> 
</VehicleStatusResponse>

VF254ANA735752628
计时器
2014-09-08T09:30:20
2014-09-08T09:30:57
49.18557
11.18557
33
500
16.4
2014-09-08T09:30:20
16.07
15.83
817.5
575
83
88.48
10000

首先,需要将值放入类型为
XML
的declare变量或XML类型的数据表列中。由于XML包含名称空间,您必须首先使用XMLNAMESPACES在
中声明它们。您可以使用通配符语法(
*:
),但最好尽可能具体

.nodes()
调用将导航到
级别。以下所有元素都是简单的
1:1
,易于阅读

您可以这样尝试:

DECLARE @xml XML=
N'<VehicleStatusResponse xmlns:ns2= 
  "http://fms-standard.com/rfms/v1.0.0/xsd/common/position" xmlns="http://fms-standard.com/rfms/v1.0.0/xsd/status"> 
<VehicleStatus> 
       <VIN>VF254ANA735752628</VIN> 
       <TriggerType>TIMER</TriggerType> 
       <CreatedDateTime>2014-09-08T09:30:20</CreatedDateTime> 
       <ReceivedDateTime>2014-09-08T09:30:57</ReceivedDateTime> 
       <GNSSPosition> 
              <ns2:Latitude>49.18557</ns2:Latitude> 
              <ns2:Longitude>11.18557</ns2:Longitude> 
              <ns2:Heading>33</ns2:Heading> 
              <ns2:Altitude>500</ns2:Altitude> 
              <ns2:Speed>16.4</ns2:Speed> 
              <ns2:PositionDateTime>2014-09-08T09:30:20</ns2:PositionDateTime> 
       </GNSSPosition> 
       <WheelBasedSpeed>16.07</WheelBasedSpeed> 
       <TachographSpeed>15.83</TachographSpeed> 
       <HRTotalVehicleDistance>817.5</HRTotalVehicleDistance> 
       <EngineTotalFuelUsed>575</EngineTotalFuelUsed> 
       <FuelLevel1>83</FuelLevel1> 
       <CatalystFuelLevel>88.48</CatalystFuelLevel> 
       <GrossCombinationVehicleWeight>10000</GrossCombinationVehicleWeight> 
</VehicleStatus> 
</VehicleStatusResponse>';
更新:插入到表中 最简单的方法是像CTE一样包装这个电话

WITH XMLNAMESPACES(...)
,DerivedTableCTE AS
(
   The query here
)
INSERT INTO YourTable (col1, col2, col3, ...)
SELECT col1, col2, col3, ...
FROM DerivedTableCTE

如果删除或修改声明,则可以使用XML类型和XML方法。SQL Server XML类型仅支持UCS-2编码,不识别“独立”。下面的示例使用字符串操纵来调整声明。您需要根据实际的列类型更改数据类型,并且应该在
INSERT
语句中指定一个显式的列列表。在本例中我省略了这一点,只是因为我不想假设实际的表列与XML中的元素名称匹配

DECLARE @xml xml;
DECLARE @xmlString nvarchar(MAX) = N'<?xml version="1.0" encoding="UTF-8" standalone="true"?> 
<VehicleStatusResponse xmlns:ns2= 
  "http://fms-standard.com/rfms/v1.0.0/xsd/common/position" xmlns="http://fms-standard.com/rfms/v1.0.0/xsd/status"> 
<VehicleStatus> 
       <VIN>VF254ANA735752628</VIN> 
       <TriggerType>TIMER</TriggerType> 
       <CreatedDateTime>2014-09-08T09:30:20</CreatedDateTime> 
       <ReceivedDateTime>2014-09-08T09:30:57</ReceivedDateTime> 
       <GNSSPosition> 
              <ns2:Latitude>49.18557</ns2:Latitude> 
              <ns2:Longitude>11.18557</ns2:Longitude> 
              <ns2:Heading>33</ns2:Heading> 
              <ns2:Altitude>500</ns2:Altitude> 
              <ns2:Speed>16.4</ns2:Speed> 
              <ns2:PositionDateTime>2014-09-08T09:30:20</ns2:PositionDateTime> 
       </GNSSPosition> 
       <WheelBasedSpeed>16.07</WheelBasedSpeed> 
       <TachographSpeed>15.83</TachographSpeed> 
       <HRTotalVehicleDistance>817.5</HRTotalVehicleDistance> 
       <EngineTotalFuelUsed>575</EngineTotalFuelUsed> 
       <FuelLevel1>83</FuelLevel1> 
       <CatalystFuelLevel>88.48</CatalystFuelLevel> 
       <GrossCombinationVehicleWeight>10000</GrossCombinationVehicleWeight> 
</VehicleStatus> 
</VehicleStatusResponse>';

SET @xmlString = REPLACE(@xmlString, 'encoding="UTF-8"', 'encoding="UCS-2"');
SET @xmlString = REPLACE(@xmlString, 'standalone="true"', '');
SET @xml = @xmlString;

WITH XMLNAMESPACES (
      DEFAULT 'http://fms-standard.com/rfms/v1.0.0/xsd/status'
    ,'http://fms-standard.com/rfms/v1.0.0/xsd/common/position' AS ns2
    )
INSERT INTO dbo.YourTable
    SELECT
          @xml.value('(/VehicleStatusResponse/VehicleStatus/VIN)[1]', 'varchar(50)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/TriggerType)[1]', 'varchar(50)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/CreatedDateTime)[1]', 'datetime2(3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/ReceivedDateTime)[1]', 'datetime2(3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Latitude)[1]', 'decimal(8,5)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Longitude)[1]', 'decimal(8,5)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Heading)[1]', 'int')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Altitude)[1]', 'int')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Speed)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:PositionDateTime)[1]', 'datetime2(3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/WheelBasedSpeed)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/TachographSpeed)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/HRTotalVehicleDistance)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/EngineTotalFuelUsed)[1]', 'int')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/CatalystFuelLevel)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GrossCombinationVehicleWeight)[1]', 'int');
DECLARE@xml;
声明@xmlString nvarchar(MAX)=N'
VF254ANA735752628
计时器
2014-09-08T09:30:20
2014-09-08T09:30:57
49.18557
11.18557
33
500
16.4
2014-09-08T09:30:20
16.07
15.83
817.5
575
83
88.48
10000
';
设置@xmlString=REPLACE(@xmlString,'encoding=“UTF-8”,'encoding=“UCS-2”);
设置@xmlString=REPLACE(@xmlString,“standalone=”true“,”);
设置@xml=@xmlString;
使用XMLNAMESPACES(
违约'http://fms-standard.com/rfms/v1.0.0/xsd/status'
,'http://fms-standard.com/rfms/v1.0.0/xsd/common/position“作为ns2
)
插入到dbo.YourTable中
挑选
@xml.value('(/VehicleStatusResponse/VehicleStatus/VIN)[1]','varchar(50)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/TriggerType)[1],'varchar(50)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/CreatedDateTime)[1],'datetime2(3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/ReceivedDateTime)[1],'datetime2(3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Latitude)[1],'decimal(8,5)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Longitude)[1],'decimal(8,5)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Heading)[1],'int')
,@xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:aighty)[1],'int')
,@xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Speed)[1],'decimal(8,3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:PositionDateTime)[1],'datetime2(3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/WheelBasedSpeed)[1],'decimal(8,3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/TachographSpeed)[1],'decimal(8,3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/HRTotalVehicleDistance)[1],'decimal(8,3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/EngineTotalFuelUsed)[1],'int')
,@xml.value('(/VehicleStatusResponse/VehicleStatus/catalystfuelevel)[1],'decimal(8,3)'
,@xml.value('(/VehicleStatusResponse/VehicleStatus/GrossCombinationVehicleWeight)[1],'int');

您正在使用哪些数据库管理系统?(大多数产品的存储过程远远不符合ANSI SQL。)SQL Server Management Studio 2016@Jarlh上面的XML缺少最后的结束标记
。请澄清您的实际问题…谢谢,我在Shnugo处更改了它。问题是如何从xml文件中获取属性,然后插入到my表中?如果上面的xml是一个真实的word示例,那么没有什么不规则的…如果只有一个xml,这不会有什么区别,但通常我建议使用
.nodes()
首先导航到目标级别,并在较短的
XPath
上使用值。您的查询将一遍又一遍地调用
.value()
…很抱歉这么挑剔,但我总是避免在没有列列表的情况下使用这样的插入。@Shnugo,我完全同意显式列列表是一种最佳做法。我之所以省略它,只是因为这个问题没有包括目标表DDL,而且我不想假设列和元素名称是相同的。我会在我的回答中加上这个。
DECLARE @xml xml;
DECLARE @xmlString nvarchar(MAX) = N'<?xml version="1.0" encoding="UTF-8" standalone="true"?> 
<VehicleStatusResponse xmlns:ns2= 
  "http://fms-standard.com/rfms/v1.0.0/xsd/common/position" xmlns="http://fms-standard.com/rfms/v1.0.0/xsd/status"> 
<VehicleStatus> 
       <VIN>VF254ANA735752628</VIN> 
       <TriggerType>TIMER</TriggerType> 
       <CreatedDateTime>2014-09-08T09:30:20</CreatedDateTime> 
       <ReceivedDateTime>2014-09-08T09:30:57</ReceivedDateTime> 
       <GNSSPosition> 
              <ns2:Latitude>49.18557</ns2:Latitude> 
              <ns2:Longitude>11.18557</ns2:Longitude> 
              <ns2:Heading>33</ns2:Heading> 
              <ns2:Altitude>500</ns2:Altitude> 
              <ns2:Speed>16.4</ns2:Speed> 
              <ns2:PositionDateTime>2014-09-08T09:30:20</ns2:PositionDateTime> 
       </GNSSPosition> 
       <WheelBasedSpeed>16.07</WheelBasedSpeed> 
       <TachographSpeed>15.83</TachographSpeed> 
       <HRTotalVehicleDistance>817.5</HRTotalVehicleDistance> 
       <EngineTotalFuelUsed>575</EngineTotalFuelUsed> 
       <FuelLevel1>83</FuelLevel1> 
       <CatalystFuelLevel>88.48</CatalystFuelLevel> 
       <GrossCombinationVehicleWeight>10000</GrossCombinationVehicleWeight> 
</VehicleStatus> 
</VehicleStatusResponse>';

SET @xmlString = REPLACE(@xmlString, 'encoding="UTF-8"', 'encoding="UCS-2"');
SET @xmlString = REPLACE(@xmlString, 'standalone="true"', '');
SET @xml = @xmlString;

WITH XMLNAMESPACES (
      DEFAULT 'http://fms-standard.com/rfms/v1.0.0/xsd/status'
    ,'http://fms-standard.com/rfms/v1.0.0/xsd/common/position' AS ns2
    )
INSERT INTO dbo.YourTable
    SELECT
          @xml.value('(/VehicleStatusResponse/VehicleStatus/VIN)[1]', 'varchar(50)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/TriggerType)[1]', 'varchar(50)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/CreatedDateTime)[1]', 'datetime2(3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/ReceivedDateTime)[1]', 'datetime2(3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Latitude)[1]', 'decimal(8,5)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Longitude)[1]', 'decimal(8,5)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Heading)[1]', 'int')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Altitude)[1]', 'int')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:Speed)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GNSSPosition/ns2:PositionDateTime)[1]', 'datetime2(3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/WheelBasedSpeed)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/TachographSpeed)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/HRTotalVehicleDistance)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/EngineTotalFuelUsed)[1]', 'int')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/CatalystFuelLevel)[1]', 'decimal(8,3)')
        , @xml.value('(/VehicleStatusResponse/VehicleStatus/GrossCombinationVehicleWeight)[1]', 'int');