XML 使用 OPENROWSET 和 OPENXML 导入到 SQL 服务器
XML import into SQL Server using OPENROWSET and OPENXML
以前从未这样做过,似乎与命名空间有关?任何帮助,将不胜感激。如果我从我的 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
只使用内置的 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_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
以前从未这样做过,似乎与命名空间有关?任何帮助,将不胜感激。如果我从我的 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
只使用内置的 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_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