为SQL查询中的列值解析XML

时间:2015-07-06 12:46:12

标签: sql-server xml join

我已经设置了一个SQL小提琴来模仿我目前拥有的表格,可以在这里找到:http://sqlfiddle.com/#!6/7675e/5

我有两个表,我想加入(Things和ThingData)这很容易,但我希望其中一列来自一个从ThingData的一列中的解析XML中提取的值

理想情况下,输出看起来像这样:

thingID | thingValue | xmlValue
1       | aaa        | a

正如你在小提琴中看到的,我能够一次解析一个XML字符串,但我不确定如何从这里使用解析内容作为列中的一个列加入。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我更新了你的SQL小提琴来演示;您面临的首要问题是您没有为XML列使用XML类型。当人们在那一栏中推动废话时,这将导致头痛:P

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

答案 1 :(得分: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的表中,然后为你修改xml中的一个值,注意如果你想为这一行返回多个值,你需要连接到回答或者决定交叉连接,然后将数据与其他数据集一起用来执行某些逻辑。

编辑:

你的问题的答案是两个都有一个用例,他上面展示的交叉连接创建了一个可查询的可访问表,它在查询运行时使用了更多的内存但可以多次访问,其中普通的xquery值函数只读取一个节点,该节点只能读取xml中的单个值。

如果您想从xml中构建表格数据,那么交叉连接将是解决方案。