2012-06-14 2 views
1

У меня есть две таблицы. Столбец содержит один столбец и столбец xml. Другие данные таблицы. Когда я пытаюсь сформировать xml из второй таблицы и обновить первую таблицу. Он обновляет только один узел, он игнорирует второй узел. Пожалуйста, обратитесь к этому примеру.SQL xml col update

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> 

Может кто-то пожалуйста, указать на то, что я делаю неправильно?

Спасибо,

Esen.

ответ

1

Может кто-нибудь указать, что я делаю неправильно?

  1. Вы самостоятельно присоединиться @mytable1 на той же самой колонке, производящей декартово произведение. on x.col1=x.col1.
  2. Ваша производная таблица возвращает две строки для каждой строки в @mytable1. Первая строка с первым узлом и второй строкой со вторым узлом. Оператор update не будет комбинировать эти строки с одним, он выберет один из них.

Делают это, как это вместо:

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-Data

+0

Большое спасибо за подробный ответ – Esen

+0

награда будет щедрот завтра, так как я не могу наградить прямо сейчас. – Esen

Смежные вопросы