2014-10-31 47 views
1

我正在嘗試設置SQL作業以將XML文件導入到SQL Server表中。使用OPENXML,我似乎無法從文件中選擇我需要的特定數據。這是我的代碼和XML數據。我試圖選擇Facility和Entity_Code,但是當我運行代碼時,這些字段顯示爲空白。OpenXML將XML文件導入SQL服務器表

我想將這些字段轉移到自己的表中。

在此先感謝。

Declare @x xml 

select @x=p 
from OPENROWSET(Bulk'\\vmirsdh01\fast_data\Small.xml', SINGLE_BLOB) as T(P) 

Select @x 

Declare @hdoc int 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @x 

Select * 
FROM OPENXML (@hdoc,'/Report/Tablix1/Details_Collection/Details',0) 
with(Facility nvarchar(255) '@Facility', 
Entity_Code nvarchar(255) '@Entity_Code') 

exec sp_xml_removedocument @hdoc 

「************ XML

<?xml version="1.0" encoding="utf-8"?><Report xsi:schemaLocation="T-Report https://csre.xxx.com%2FDevelopment%20Folder%2FIand%2FT-Report&amp;rs%3ACommand=Render&amp;rs%3AFormat=XML&amp;rs%3ASessionID=4keav12uayp33ve3uczpgmfr&amp;rc %3ASchema=True" Name="T-Report" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="T_Report"> 
<Tablix1> 
<Details_Collection><Details Facility="Fxx" Tool_Type="Base Build" Entity_Code="EquiP1" /></Details_Collection> 
</Tablix1> 
</Report> 

這裏是一個可執行版本

Declare @x xml 

select @x='<?xml version="1.0" encoding="utf-8"?><Report xsi:schemaLocation="T-Report https://csre.xxx.com%2FDevelopment%20Folder%2FIand%2FT-Report&amp;rs%3ACommand=Render&amp;rs%3AFormat=XML&amp;rs%3ASessionID=4keav12uayp33ve3uczpgmfr&amp;rc %3ASchema=True" Name="T-Report" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="T_Report"> 
<Tablix1> 
<Details_Collection><Details Facility="Fxx" Tool_Type="Base Build" Entity_Code="EquiP1" /></Details_Collection> 
</Tablix1> 
</Report>' 

Declare @hdoc int 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @x 

Select * 
FROM OPENXML (@hdoc,'/Report/Tablix1/Details_Collection/Details',0) 
with(Facility nvarchar(255) '@Facility', 
Entity_Code nvarchar(255) '@Entity_Code') 

exec sp_xml_removedocument @hdoc 

回答

0

你的XML有<Report>但你一打開標籤查詢是針對名爲<Result>的開始標記。

雖然我不能發誓,修復後一切都會正常工作(我沒有用OPENXML做很多),我相當確信這是的問題。

+0

好斑。這是一個錯誤,但這仍然不能解決問題。我在帖子中糾正了它。謝謝 – user1781272 2014-10-31 12:42:24

2

您有一個需要考慮的默認名稱空間xmlns="T_Report"

使用XML變量直接查詢看起來像

with xmlnamespaces(default 'T_Report') 
select D.X.value('@Facility', 'nvarchar(255)'), 
     D.X.value('@Entity_Code', 'nvarchar(255)') 
from @x.nodes('/Report/Tablix1/Details_Collection/Details') as D(X) 

如果你因爲某些原因想用你需要聲明的命名空間中的第三個參數sp_xml_preparedocument中OPENXML。

EXEC sp_xml_preparedocument @hdoc OUTPUT, @x, '<root xmlns:xx="T_Report"/>' 

Select * 
FROM OPENXML (@hdoc,'/xx:Report/xx:Tablix1/xx:Details_Collection/xx:Details',0) 
with(Facility nvarchar(255) '@Facility', 
Entity_Code nvarchar(255) '@Entity_Code') 

exec sp_xml_removedocument @hdoc