2009-12-01 61 views
2

似乎沒有任何數量的閱讀文檔將幫助我。考慮簡化的例子:如何在T-SQL中合併XML?

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> 

回答

5

下面是不是基於設置,但也許這將有助於(僅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; 
+0

這是罰款,因爲我不需要使用遊標。 – dudeNumber4 2009-12-01 22:00:52

+0

爲什麼只有SQL 2008? 2005年也不行?您需要在遊標循環btw中的兩個選擇中使用@id。 – 2009-12-01 22:00:56

+0

Remus,你當然是對的。應該使用@id。 我說SQL 2008只是因爲這裏報道的問題:http://tinyurl.com/lst3cz – 2009-12-02 16:35:59

4

您正在詢問XML操作,而不是關係操作。你想要的是通過產生一個新的XML,將的XML片段插入到它中,這意味着你必須使用xml.modify()方法。從技術上講,這是可能的,但在更新上下文中調用modify()必須,所以它不能在SELECT中工作。它可以在一個SET或在更新工作:

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 。