2015-11-19 82 views
1

我的日誌提供商輸出下面的XML的格式如下,以SQL:SQL - 從XML日誌返回特定部分

-ID (int) 
-Info (xml) 

xml格式是:

<Info xmlns="http://loggingprovider"> 
    <Output> 
    <columnNames> 
     <name>sale_nbr</name> 
    </columnNames> 
    <rowValues> 
     <value value="51500" /> 
    </rowValues> 
    </Output> 
</Info> 

我試圖返回每個信息日誌中的sale_nbr(51500)列表,但是遇到特殊的xml類型返回任何東西時遇到問題。

+2

哪種RDBMS適用於?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 XML支持**高度**供應商特定 –

回答

1

你不說出你的RDBMS,只是作爲一個提示(並且是第一個;-))這是SQL Server的解決方案:

首先,我聲明瞭一個表,你的兩列,並填充你的「信息」。在聲明默認命名空間(xmlns)時,有必要使用WITH XMLNAMESPACES

DECLARE @tbl TABLE(ID INT,Info XML); 
INSERT INTO @tbl VALUES(1, 
'<Info xmlns="http://loggingprovider"> 
    <Output> 
    <columnNames> 
     <name>sale_nbr</name> 
    </columnNames> 
    <rowValues> 
     <value value="51500" /> 
    </rowValues> 
    </Output> 
</Info>'); 

WITH XMLNAMESPACES(DEFAULT 'http://loggingprovider') 
SELECT ID 
     ,Info.value('(/Info/Output/rowValues/value/@value)[1]','int') AS sale_nbr 
FROM @tbl AS tbl; 

/* Result 
ID sale_nbr 
1 51500 
*/ 
1

這是爲了做到這一點在DB2單程(使用@Shnugo例如數據)

select base.*, info.* 
from TABLENAME base, 
    XMLTABLE('$info/*:Info/*:Output' passing Info as "info" 
    COLUMNS 

    val INTEGER PATH '*:rowValues/*:value/@value', 
    name VARCHAR(200) PATH '*:columnNames/*:name' 
) as info 
1

的WITH XMLNAMESPACES(DEFAULT 'http://loggingprovider')是在缺失的環節。謝謝您的幫助。

+0

嗨,我很高興,我的回答可以幫助你!請允許我提一些提示:這不是答案,而是對我的答案的評論。此外,將最有幫助的答案標記爲已接受將是非常友好的。這將向其他用戶顯示,該問題已解決。而且:所有專業人士在這裏給出的答案都渴望聲望點。這是我們的「付款」。 :-) – Shnugo