簡體   English   中英

將結構化 XML 文件導入 SQL 表

[英]Import structured XML file to SQL table

我正在嘗試下載 XML 文件並將其導入 SQL 表。 下載工作正常,並生成以下 XML 文件。

GeoPers.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:

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 向查詢添加命名空間

這將起作用。 您沒有選擇正確的命名空間; 為此使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM