2016-07-15 3 views
1
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が含ま>>は、XMLからの電子メール情報を取得したい、しかし、

<ns2:FORM xmlns="http://abc" xmlns:ns2="http://def"> 
<ns2:Form1> 
    <ns2:Part> 
<ns2:Part1> 
<ns2:Ba> 
    <ns2:EmailA>[email protected]</ns2:EmailA> ... 

Error:Msg 6603, Level 16, State 2, Line 6 XML parsing error: Expected token 'eof' found ':'.

d:ns2-->:<--FORM/ns2:Form1/ns2:Part/ns2:Part1/ns2:Ba

+0

実際の質問をしてください。現時点では、フォーマッタ・コード、エラー・メッセージ、および識別/理解が困難な部分だけが見えます。 – YakovL

+0

[可能な重複](@stackoverflow.com/questions/18705045/select-xml-from-table-in-sql-server) – SND

+0

@SeekAndDestroyリンクされた質問はかなりの問題を追加する名前空間をカバーしません。 .. – Shnugo

答えて

2

sp_xml_...方法とFROM OPENXMLとのアプローチは時代遅れであります!

.nodes(),,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>[email protected]</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)') 

あなたはすべきである - しかし - フルアプローチを好みます。あなたが与えるほど、より速く、より速くあなたは得る...

関連する問題