Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用OPENROWSET和OPENXML将XML导入SQL Server_Sql Server_Xml_Openxml_Openrowset - Fatal编程技术网

Sql server 使用OPENROWSET和OPENXML将XML导入SQL Server

Sql server 使用OPENROWSET和OPENXML将XML导入SQL Server,sql-server,xml,openxml,openrowset,Sql Server,Xml,Openxml,Openrowset,以前从未这样做过,似乎名称空间有问题?任何帮助都将不胜感激。如果我从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.

以前从未这样做过,似乎名称空间有问题?任何帮助都将不胜感激。如果我从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>

只需使用内置的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)
给我一个输出:


如果出于某种原因必须使用
openxml
,则需要将命名空间声明添加到
sp\u xml\u 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
declare@xml varchar(max)=--无需声明为xml
'
001
75-998
007
14-172
'
声明@hdoc int
--注x:ETS之前和xmlns之后
EXEC sp_xml_preparedocument@hdoc OUTPUT,@xml,'
--注十:在要素之前
挑选*
来自OPENXML(@hdoc,'x:ETS/x:WellTours/x:WellTours',2)
与(
WellName varchar(100)'x:WellName',
LicenseNo varchar(100)'x:LicenseNo');
EXEC sp_xml_removedocument@hdoc

@C-COOP:如果你觉得这个答案帮助你解决了问题,那么请。这将表达你对那些花自己的时间帮助你的人的感激之情。
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