2015-07-06 44 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