2015-07-06 85 views
0

我已經成立了一個SQL小提琴模仿它可以在這裏找到,我目前擁有的表:http://sqlfiddle.com/#!6/7675e/5解析XML在一個SQL查詢中的列值

我有2個表,我想加入(Things和ThingData),這很容易,但是我希望其中的一列來自ThingData中某列的解析XML中的值。

理想情況下,輸出會是這個樣子:

thingID | thingValue | xmlValue 
1  | aaa  | a 

正如你可以在小提琴看,我能夠一次解析一個XML字符串,但我不能確定如何從這裏開始使用解析的東西作爲連接中的列。任何幫助將不勝感激。

回答

1

我更新了你的SQL小提琴來演示;您面臨的頭號問題是您沒有爲XML列使用XML類型。那將會引起頭痛的道路,因爲人們在該列推廢話:P

http://sqlfiddle.com/#!6/4c674/2

+0

謝謝,我同意列類型,但不幸的是,這不是我自己。我剛想出了一個不同的解決方案(在最終在這裏找到更相關的問題後),它看起來就像下面的Hano。我最初認爲答案需要像您正在使用的CROSS APPLY,但是Hano和我有什麼不這樣做。你能解釋我們的解決方案之間的差異,僅僅是爲了我自己的教化嗎? – jrut127

+0

最大的區別是CROSS APPLY允許你從XML中檢索多個節點(例如,你想爲每一行提取兩個c1的值);如果你能保證你一次只想拉一個節點,Hano的建議就沒有問題。 –

+0

很高興知道,感謝您的幫助。 – jrut127

0

我已經做了更改您的查詢被執行。

DECLARE @xml xml 
SET @xml = (select thingDataXML from ThingData where thingDataID = 3) 

;WITH XMLNAMESPACES(DEFAULT 'http://www.testing.org/a/b/c/d123') 
SELECT 
    t.[thingID] 
    , t.[thingValue] 
    , CONVERT(XML,td.[thingDataXML]).value('(/anItem/a1/b1/c1/text())[1]','Varchar(1)') as xmlValue 
FROM Things t 
    join ThingData td 
     on td.[thingDataID] = t.[thingDataID] 

這應該從你主表連接到包含XML表,然後將retreive的一個值,在XML的你,請注意,如果您想爲一排,你需要返回多個值要麼是答案的答案,要麼是決定一個交叉聯盟,然後使用其他數據集的數據來執行一些邏輯。

編輯:

你的問題的答案將是雙方都有一個用例中,交叉連接他發現上面創建一個入店表來查詢其使用更多一點點的內存,同時運行查詢,但可以訪問很多次,其中正常的xquery值函數只讀取一個只能從xml讀取單個值的節點。

如果您想從xml中構建表格數據,交叉連接將是解決方案。

+0

謝謝,就像我上面提到的Stuart,提出了一個完全像你的解決方案,現在我好奇哪個更好,爲什麼。 – jrut127