2016-08-22 24 views
1

Haben Sie dies noch nie getan, scheinen Probleme mit Namespaces zu haben? Jede Hilfe wäre willkommen. Wenn ich die xmlns Attribute aus meiner XML-Datei entfernen, es funktioniert ...XML-Import in SQL Server mit OPENROWSET und OPENXML

XML-Beispiel:

<?xml version="1.0" encoding="UTF-8"?> 
<ETS xsi:schemaLocation="http://www.caodc.ca/ETS/v3 ETS_v3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.caodc.ca/ETS/v3"> 
<WellTours> 
<WellTour> 
<LicenseNo>001</LicenseNo> 
<WellName>75-998</WellName> 
</WellTour> 
<WellTour> 
<LicenseNo>007</LicenseNo> 
<WellName>14-172</WellName> 
</WellTour> 
</WellTours> 
</ETS> 

Hier ist meine SQL:

DECLARE @xml xml 

SELECT @xml=I 
FROM OPENROWSET (BULK 'C:\CCTESTFILE.XML', SINGLE_BLOB) as ImportFile(I) 

SELECT @xml 

DECLARE @hdoc int 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml 

SELECT * 
FROM OPENXML (@hdoc, '/ETS/WellTours/WellTour',2) 
WITH (
     WellName varchar(100), 
     LicenseNo varchar(100)); 

EXEC sp_xml_removedocument @hdoc 

Antwort

0

Viel einfacher, nur die eingebauten verwenden in XQuery Funktionalität anstelle der alten, sperrig und Speicher leckenden OPENXML Ansatz:

;WITH XMLNAMESPACES(DEFAULT 'http://www.caodc.ca/ETS/v3') 
SELECT 
    LicenseNo = XC.value('(LicenseNo)[1]', 'varchar(10)'), 
    WellName = XC.value('(WellName)[1]', 'varchar(25)') 
FROM 
    @xml.nodes('/ETS/WellTours/WellTour') AS XT(XC) 

Gibt mir eine Ausgabe von:

enter image description here

+0

Perfekt - danke. –

+0

@ C-COOP: Wenn Sie glauben, dass diese Antwort Ihnen geholfen hat, Ihr Problem zu lösen, dann bitte [** akzeptiere diese Antwort **] (http://meta.stackoverflow.com/q/5234/153998). Dies wird Ihre Wertschätzung für die Menschen zeigen, die Ihre Zeit verbracht haben, um Ihnen zu helfen *. –

+0

Wird - nochmals vielen Dank. –

0

Wenn aus irgendeinem Grund müssen Sie verwenden openxml dann müssen Sie Namespace-Deklaration zu sp_xml_preparedocument Anruf hinzuzufügen. Etwas wie das.

declare @xml varchar(max)= --no need to declare as xml 
'<?xml version="1.0" encoding="UTF-8"?> 
<ETS xsi:schemaLocation="http://www.caodc.ca/ETS/v3 ETS_v3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.caodc.ca/ETS/v3"> 
<WellTours> 
<WellTour> 
<LicenseNo>001</LicenseNo> 
<WellName>75-998</WellName> 
</WellTour> 
<WellTour> 
<LicenseNo>007</LicenseNo> 
<WellName>14-172</WellName> 
</WellTour> 
</WellTours> 
</ETS>' 

DECLARE @hdoc int 

--Note x: before ETS and :x after xmlns 
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml, '<x:ETS xmlns:x="http://www.caodc.ca/ETS/v3" />' 

--Note x: before elements 
SELECT * 
FROM OPENXML (@hdoc, 'x:ETS/x:WellTours/x:WellTour',2) 
WITH (
     WellName varchar(100) 'x:WellName', 
     LicenseNo varchar(100) 'x:LicenseNo'); 

EXEC sp_xml_removedocument @hdoc