Как объединить XML в T-SQL? - PullRequest
       35

Как объединить XML в T-SQL?

2 голосов
/ 02 декабря 2009

Не похоже, что какое-то количество чтения документов поможет мне. Рассмотрим упрощенный пример:

declare @table1 table ( id int, parent xml )
insert @table1 values( 1, '<Root></Root>' )
declare @table2 table ( id int, guts xml )
insert @table2 values( 1, '<Guts>hi mom!</Guts>' )

select t1.parent.query('')
from @table1 t1 inner join @table2 t2 on t1.id = t2.id

Что будет передано в функцию запроса для генерации этого результата?

<Root><Guts>hi mom!</Guts></Root>

Ответы [ 2 ]

5 голосов
/ 02 декабря 2009

Следующее не установлено на основе, но, возможно, это поможет (только SQL2008)

declare @table1 table ( id int, parent xml )
insert @table1 values( 1, '<Root></Root>' )
declare @table2 table ( id int, guts xml )
insert @table2 values( 1, '<Guts>hi mom!</Guts>' )

DECLARE @id int;
DECLARE @results table (id int, results xml);

DECLARE idCursor CURSOR FOR 
    select id from @table1
OPEN idCursor

FETCH NEXT FROM idCursor INTO @id

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @parent xml, @guts xml

    SELECT @parent = parent FROM @table1 where id = 1;
    SELECT @guts = guts FROM @table2 where id = 1;
    SET @parent.modify('insert sql:variable("@guts") into (/Root[1])');

    INSERT @results (id, results) values (@id, @parent);

    FETCH NEXT FROM idCursor INTO @id

END 

CLOSE idCursor
DEALLOCATE idCursor

select * from @results;
4 голосов
/ 02 декабря 2009

Вы запрашиваете операцию XML, а не реляционную операцию. Вам нужно создать новый XML, вставив фрагмент XML в него , что означает, что вы должны использовать метод xml.modify () . Технически это возможно, но modify () должен вызываться в контексте обновления, поэтому он не будет работать в SELECT. Может работать в наборе или ОБНОВЛЕНИИ:

UPDATE t1
 SET parent.modify(N'insert sql:column("t2.guts") into (/Root)[1]')
FROM @table1 t1
 JOIN @table2 t2 on t1.id = t2.id;
SELECT * from @table1;

Если у вас должен быть результат в SELECT, вам придется разбить XML на реляционную таблицу, объединить его и восстановить XML, используя FOR XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...