我正在尝试设置SQL作业以将XML文件导入SQL Server表。使用OPENXML,我似乎无法从文件中选择我需要的特定数据。这是我的代码和XML数据。我试图选择Facility和Entity_Code,但是当我运行代码时,这些字段显示为空白。
我想将这些字段转移到自己的表格中。
提前致谢。
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&rs%3ACommand=Render&rs%3AFormat=XML&rs%3ASessionID=4keav12uayp33ve3uczpgmfr&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&rs%3ACommand=Render&rs%3AFormat=XML&rs%3ASessionID=4keav12uayp33ve3uczpgmfr&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 :(得分: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)
如果由于某种原因想要使用openxml,则需要将第三个参数中的命名空间声明为sp_xml_preparedocument。
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
答案 1 :(得分:0)
您的XML的开头标记为<Report>
,但您的查询是针对名为<Result>
的开始标记。
虽然我不能发誓一切都会解决之后(我不会对OPENXML
做很多事情)我很相信那是 a < / em>问题。