1

我有两张桌子。一张表包含键列和 xml 列。其他表保存数据。当我尝试从第二个表形成 xml 并更新第一个表时。它只更新一个节点,它忽略了第二个节点。请参考这个例子。

    declare @mytable table
    (
    col1 int,
    col2 varchar(100)
    )
    declare @mytable1 table
    (
    col1 int,
    col2 xml
    )
    insert into @mytable1 values(1,null)
    insert into @mytable1 values(2,null)

    insert into @mytable values(1,'abc')
    insert into @mytable values(1,'dcf')
    insert into @mytable values(2,'efg')
    insert into @mytable values(2,'hhh')

    update x set col2=  d.XMLCol from @mytable1 x
    inner join
    (select a.col1,  node.XMLCol from @mytable a join @mytable1 b on a.col1=b.col1 cross apply (select a.col1,a.col2 for xml path('record') , root ('myroot'), type
    ) as node(XMLCol)  )d
    on x.col1=x.col1

    select * from @mytable1

实际结果是

1   <myroot><record><col1>1</col1><col2>abc</col2></record></myroot>
2   <myroot><record><col1>2</col1><col2>hhh</col2></record></myroot>

预期结果是

1   <myroot><record><col1>1</col1><col2>abc</col2></record><record><col1>1</col1><col2>dcf</col2></record></myroot>
2   <myroot><record><col1>2</col1><col2>hhh</col2></record><record><col1>2</col1><col2>efg</col2></record></myroot>

有人可以指出我做错了什么吗?

谢谢,

埃森。

4

1 回答 1

1

有人可以指出我做错了什么吗?

  1. @mytable1在生产笛卡尔积的同一列上自行加入。on x.col1=x.col1.
  2. 您的派生表为 中的每一行返回两行@mytable1。第一行带有第一个节点,第二行带有第二个节点。更新语句不会将这些行合并为一,它会选择其中之一。

改为这样做:

update x set 
  col2 = (
          select a.col1,
                 a.col2
          from @mytable as a
          where x.col1 = a.col1
          for xml path('record'), root('myroot'), type
         )
from @mytable1 x

SE-数据

于 2012-06-18T13:22:05.017 回答