2015-06-15 145 views
0

我不在這裏?我不能讓NULL除外任何的回報......使用TSQL檢索XML節點值?

DECLARE @xml xml 
SELECT @xml = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
    <webregdataResponse> 
     <result>0</result> 
     <regData /> 
     <errorFlag>99</errorFlag> 
     <errorResult>Not Processed</errorResult> 
    </webregdataResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>' 

DECLARE @nodeVal int 
SELECT @nodeVal = @xml.value('(errorFlag)[1]', 'int') 
SELECT @nodeVal 

回答

0

這裏是解決方案:

DECLARE @xml xml 
SELECT @xml = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
    <webregdataResponse> 
     <result>0</result> 
     <regData /> 
     <errorFlag>99</errorFlag> 
     <errorResult>Not Processed</errorResult> 
    </webregdataResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>' 


declare @table table (data xml); 
insert into @table values (@xml); 

WITH xmlnamespaces (
'http://schemas.xmlsoap.org/soap/envelope/' as [soap]) 
SELECT Data.value('(/soap:Envelope/soap:Body/webregdataResponse/errorFlag)[1]','int') AS ErrorFlag 
FROM @Table ; 

運行上面的SQL將返回結果的99

快照下面給出,

Snapshot of the result

+0

謝謝Vimalan。仍然在XPath曲線的陡峭部分。 – dbrosier

0

這是因爲errorFlag是而不是XML文檔的根元素。您可以指定從根元素完整路徑errorFlag,例如*:

SELECT @nodeVal = @xml.value('(/*/*/*/errorFlag)[1]', 'int') 

,或者你可以按名稱,無論使用後代或本身軸(//),以獲得元素的它的XML文檔中的位置,例如:

SELECT @nodeVal = @xml.value('(//errorFlag)[1]', 'int') 

*:我使用*,而不是實際的元素名稱只是爲了簡化的表達。您也可以使用實際的元素名稱以及命名空間,如其他答案中所示。