2016-08-22 95 views
1

以前從未這樣做過,似乎遇到命名空間問題?任何幫助,將不勝感激。如果我刪除從我的XML的xmlns屬性文件,它工作正常...使用OPENROWSET和OPENXML將XML導入SQL Server

示例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> 

這裏是我的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 

回答

0

簡單得多隻使用內置在XQuery功能,而不是舊的,龐大的和內存泄漏OPENXML方法:

;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) 

給我的輸出:

enter image description here

+0

完美 - 謝謝。 –

+0

@ C-COOP:如果您覺得此答案有助於您解決問題,請[**接受此答案**](http://meta.stackoverflow.com/q/5234/153998)。這將表明你對那些花時間幫助你的人表示感謝。 –

+0

會做 - 再次感謝。 –

0

如果由於某種原因,你必須使用openxml,那麼你需要的命名空間聲明添加到sp_xml_preparedocument通話。像這樣的東西。

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