【问题标题】:OpenXML Import XML file to SQL server tableOpenXML 将 XML 文件导入 SQL 服务器表
【发布时间】:2014-10-31 10:39:09
【问题描述】:

我正在尝试设置 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&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

【问题讨论】:

    标签: sql xml sql-server-2008 import sql-server-openxml


    【解决方案1】:

    您有一个需要考虑的默认命名空间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
    

    【讨论】:

      【解决方案2】:

      您的 XML 的开始标签为 &lt;Report&gt;,但您的查询是针对名为 &lt;Result&gt; 的开始标签。

      虽然我不能发誓在你解决这个问题后一切都会好起来(我对 OPENXML 做的不多)我相当有信心这是一个问题。

      【讨论】:

      • 很好看。这是一个错误,但这仍然不能解决问题。我在帖子上更正了。谢谢
      猜你喜欢
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多