Sql 将不规则xml文件传递到存储过程
我有一个示例xml,如下所示。我试图获取所有或特定的数据,然后插入到MySQL表中,该表具有表示来自xml的值的相同列。我查看了一些解决方案,但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 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');