[英]Import structured XML file to SQL table
我正在嘗試下載 XML 文件並將其導入 SQL 表。 下載工作正常,並生成以下 XML 文件。
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Clocking_GetByDateRangeUtcResponse xmlns="http://www.geodynamics.be/webservices">
<Clocking_GetByDateRangeUtcResult>
<ClockingEntity>
<Id>af261a77-a35b-4778-a175-6fd50d00cde1</Id>
<DateTimeUtc>2017-09-28T02:37:56Z</DateTimeUtc>
<DateTimeLocal>2017-09-28T04:37:56</DateTimeLocal>
<User>
<Id>4975535a-2690-4492-bc7f-5e8a7d839cb9</Id>
<Name>Marcel De Doncker</Name>
<DayProgramId xsi:nil="true"/>
</User>
<Vehicle>
<Id>52e01d9c-96fa-46ed-98fe-f62e1792f019</Id>
<Code>7080</Code>
<Name>Auto: Dacia Dokker 1-PAE-120</Name>
<VehicleTypeId xsi:nil="true"/>
<LastSyncDateUtc xsi:nil="true"/>
</Vehicle>
<Type>StartMovementDriver</Type>
<Location>
<Address>
<Street>Kapelleveld</Street>
<HouseNumber>49</HouseNumber>
<PostalCode>1785</PostalCode>
<City>Merchtem</City>
<Submunicipality>Merchtem</Submunicipality>
<Country>Belgium</Country>
</Address>
<Longitude>4.2380828857421875</Longitude>
<Latitude>50.9540901184082</Latitude>
</Location>
<Pois/>
<IsManual>false</IsManual>
</ClockingEntity>
</Clocking_GetByDateRangeUtcResult>
</Clocking_GetByDateRangeUtcResponse>
</soap:Body>
</soap:Envelope>
我正在使用以下查詢將文件加載到 SQL:
DECLARE @XmlFile XML
SELECT @XmlFile = BulkColumn
FROM OPENROWSET(BULK 'C:\Temp\GeoDynamics\Downloads\GeoPers.xml', SINGLE_BLOB) x
SELECT
Id = resource.value('(Id)[1]', 'varchar(255)'),
DateTimeUtc = resource.value('(DateTimeUtc)[2]', 'varchar(255)'),
DateTimeLocal = resource.value('(DateTimeLocal)[3]', 'varchar(255)'),
UserID = resource.value('(User/Id)[4]', 'varchar(255)'),
UserName = resource.value('(User/Name)[5]', 'varchar(255)'),
VehicleID = resource.value('(Vehicle/Id)[6]', 'varchar(255)'),
VehicleCode = resource.value('(Vehicle/Code)[7]', 'varchar(255)'),
VehicleName = resource.value('(Vehicle/Name)[8]', 'varchar(255)')
FROM
@XmlFile.nodes('//Clocking_GetByDateRangeUtcResponse/Clocking_GetByDateRangeUtcResult/ClockingEntity') AS XTbl1(resource)
查詢沒有給出結果,甚至沒有給出錯誤代碼。 我不知道我在查詢中哪里錯了。
主要問題是您的 XML 具有默認名稱空間 ( http://www.geodynamics.be/webservices
)。 您將需要使用WITH XMLNAMESPACES
指令為您的查詢指定該命名空間。
正如另一個答案中提到的,您還需要修復 XPath 查詢中的索引 - 它們都應該是[1]
。
WITH XMLNAMESPACES (DEFAULT 'http://www.geodynamics.be/webservices')
SELECT
Id = resource.value('(Id)[1]', 'varchar(255)'),
DateTimeUtc = resource.value('(DateTimeUtc)[1]', 'varchar(255)'),
DateTimeLocal = resource.value('(DateTimeLocal)[1]', 'varchar(255)'),
UserID = resource.value('(User/Id)[1]', 'varchar(255)'),
UserName = resource.value('(User/Name)[1]', 'varchar(255)'),
VehicleID = resource.value('(Vehicle/Id)[1]', 'varchar(255)'),
VehicleCode = resource.value('(Vehicle/Code)[1]', 'varchar(255)'),
VehicleName = resource.value('(Vehicle/Name)[1]', 'varchar(255)')
FROM
@XmlFile.nodes('//Clocking_GetByDateRangeUtcResponse/Clocking_GetByDateRangeUtcResult/ClockingEntity') AS XTbl1(resource);
輸出:
Id af261a77-a35b-4778-a175-6fd50d00cde1
DateTimeUtc 2017-09-28T02:37:56Z
DateTimeLocal 2017-09-28T04:37:56
UserID 4975535a-2690-4492-bc7f-5e8a7d839cb9
UserName Marcel De Doncker
VehicleID 52e01d9c-96fa-46ed-98fe-f62e1792f019
VehicleCode 7080
VehicleName Auto: Dacia Dokker 1-PAE-120
這將起作用。 您沒有選擇正確的命名空間; 為此使用WITH XMLNAMESPACES 。 其次,除了Id
元素之外,您選擇了錯誤的索引; 您指定的索引[n]
將選擇元素的第 n 次出現。 你總是需要第一個。
DECLARE @x XML=N'
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Clocking_GetByDateRangeUtcResponse xmlns="http://www.geodynamics.be/webservices">
<Clocking_GetByDateRangeUtcResult>
<ClockingEntity>
<Id>af261a77-a35b-4778-a175-6fd50d00cde1</Id>
<DateTimeUtc>2017-09-28T02:37:56Z</DateTimeUtc>
<DateTimeLocal>2017-09-28T04:37:56</DateTimeLocal>
<User>
<Id>4975535a-2690-4492-bc7f-5e8a7d839cb9</Id>
<Name>Marcel De Doncker</Name>
<DayProgramId xsi:nil="true"/>
</User>
<Vehicle>
<Id>52e01d9c-96fa-46ed-98fe-f62e1792f019</Id>
<Code>7080</Code>
<Name>Auto: Dacia Dokker 1-PAE-120</Name>
<VehicleTypeId xsi:nil="true"/>
<LastSyncDateUtc xsi:nil="true"/>
</Vehicle>
<Type>StartMovementDriver</Type>
<Location>
<Address>
<Street>Kapelleveld</Street>
<HouseNumber>49</HouseNumber>
<PostalCode>1785</PostalCode>
<City>Merchtem</City>
<Submunicipality>Merchtem</Submunicipality>
<Country>Belgium</Country>
</Address>
<Longitude>4.2380828857421875</Longitude>
<Latitude>50.9540901184082</Latitude>
</Location>
<Pois/>
<IsManual>false</IsManual>
</ClockingEntity>
</Clocking_GetByDateRangeUtcResult>
</Clocking_GetByDateRangeUtcResponse>
</soap:Body>
</soap:Envelope>';
WITH XMLNAMESPACES(DEFAULT 'http://www.geodynamics.be/webservices' )
SELECT
Id = resource.value('(Id)[1]', 'varchar(255)'),
DateTimeUtc = resource.value('(DateTimeUtc)[1]', 'varchar(255)'),
DateTimeLocal = resource.value('(DateTimeLocal)[1]', 'varchar(255)'),
UserID = resource.value('(User/Id)[1]', 'varchar(255)'),
UserName = resource.value('(User/Name)[1]', 'varchar(255)'),
VehicleID = resource.value('(Vehicle/Id)[1]', 'varchar(255)'),
VehicleCode = resource.value('(Vehicle/Code)[1]', 'varchar(255)'),
VehicleName = resource.value('(Vehicle/Name)[1]', 'varchar(255)')
FROM
@x.nodes('//Clocking_GetByDateRangeUtcResponse/Clocking_GetByDateRangeUtcResult/ClockingEntity') AS XTbl1(resource)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.