CREATE TABLE XMLTABLE(id int IDENTITY PRIMARY KEY,XML_DATA XML,DATE DATETIME);
go
INSERT INTO XMLTABLE(XML_DATA,DATE)
SELECT CONVERT(XML,BULKCOLUMN)AS DATA,getdate()
FROM OPENROWSET(BULK 'c:\Demo.xml',SINGLE_BLOB)AS x
go
DECLARE @XML AS XML
DECLARE @OUPT AS INT
DECLARE @SQL NVARCHAR (MAX)
SELECT @XML= XML_DATA FROM XMLTABLE
EXEC sp_xml_preparedocument @OUPT OUTPUT,@XML,'<root xmlns:d="http://abc" xmlns:ns2="http://def" />'
SELECT EMAILR
FROM OPENXML(@OUPT,'d:ns2:FORM/ns2:Form1/ns2:Part/ns2:Part1/ns2:Ba')
WITH
(EMAILR [VARCHAR](100) 'ns2:EmailAddress')
EXEC sp_xml_removedocument @OUPT
go
即Demo.xml包含&gt;&gt;
<ns2:FORM xmlns="http://abc" xmlns:ns2="http://def">
<ns2:Form1>
<ns2:Part>
<ns2:Part1>
<ns2:Ba>
<ns2:EmailA>Hello@YAHOO.COM</ns2:EmailA> ...
错误:消息6603,级别16,状态2,行6 XML解析错误:预期 令牌&#39; eof&#39;发现&#39;:&#39;。
d:NS2 - &GT;:其中 - FORM / NS2:Form1中/ NS2:部分/ NS2:第一部分/ NS2:巴
答案 0 :(得分:2)
使用sp_xml_...
方法和FROM OPENXML
的方法已过时!
您最好使用当前的XML方法.nodes()
,.value()
,query()
和.modify()
。
您的XML示例不完整,两者都无效,必须稍微更改才能使其正常工作。您可能需要调整XPath
(至少Part1
丢失)。
DECLARE @xml XML=
'<ns2:FORM xmlns="http://abc" xmlns:ns2="http://def">
<ns2:Form1>
<ns2:Part>
<ns2:Ba>
<ns2:EmailA>Hello@YAHOO.COM</ns2:EmailA>
</ns2:Ba>
</ns2:Part>
</ns2:Form1>
</ns2:FORM> ';
这是名称空间和完整路径的安全方式
WITH XMLNAMESPACES(DEFAULT 'http://abc'
,'http://def' AS ns2)
SELECT @xml.value('(/ns2:FORM/ns2:Form1/ns2:Part/ns2:Ba/ns2:EmailA)[1]','nvarchar(max)');
这是懒惰的方法
SELECT @xml.value('(//*:EmailA)[1]','nvarchar(max)')
您应该 - 但是 - 更喜欢完整方法。你给的越多,你得到的越快越好......