【问题标题】:XML import into SQL Server using OPENROWSET and OPENXML使用 OPENROWSET 和 OPENXML 将 XML 导入 SQL Server
【发布时间】:2016-12-29 09:06:15
【问题描述】:

以前从未这样做过,似乎对命名空间有问题?任何帮助,将不胜感激。如果我从 XML 文件中删除 xmlns 属性,它可以正常工作...

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

【问题讨论】:

    标签: sql-server xml openxml openrowset


    【解决方案1】:

    仅使用内置 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)
    

    给我一​​个输出:

    【讨论】:

    • @C-COOP:如果你觉得这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
    【解决方案2】:

    如果由于某种原因您必须使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2013-05-26
      • 2023-03-16
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      相关资源
      最近更新 更多