2016-09-23 49 views
1

表名XML:樣品創建具有相同的標籤名稱

列名:ID,名稱

每一行創建內部獨立標籤。

顯示這樣

<Details> 
    <id>1</id> 
    <name>na</name> 
    <Details> 
     <id>2</id> 
     <name>aa</name> 
    </Details> 
    </Details> 

XML值我試過這樣,但它不工作

select 
    id  'Details\id' 
    ,name 'Details\name' 
from sample 

如何獲取XML輸出?

+0

爲什麼具有值2的節點ID進入內部?它等於1記錄? –

+0

@KannanKandasamy我需要這種格式。每行都進入標籤全部進來xml。如果我有4行4即將結束。

標籤在每行的值開始 – Sathish

回答

2

它是硬編碼的,但應該工作:

DECLARE @x xml 

SELECT @x = (
    SELECT x+'' 
    FROM (
     SELECT '%details?%id?'+CAST(id as nvarchar(max))+'%/id?%name?'+name+'%/name?' x 
     FROM [sample] s 
     UNION ALL 
     SELECT '%/details?' 
     FROM [sample] s 
     ) as t 
    FOR XML PATH('') 
) 
SELECT CAST(REPLACE(REPLACE((CAST(@x as nvarchar(max))),'%','<'),'?','>') as xml) 

In [sample]表我:

(1,'na'), 
(2,'aa'), 
(3,'sd') 

輸出:

<details> 
    <id>1</id> 
    <name>na</name> 
    <details> 
    <id>2</id> 
    <name>aa</name> 
    <details> 
     <id>3</id> 
     <name>sd</name> 
    </details> 
    </details> 
</details> 

編輯

此外,它可以用遞歸CTE來完成:

DECLARE @x xml 

;WITH rec AS (
SELECT CAST((
      SELECT TOP 1 id, 
          [name] 
      FROM [sample] 
      ORDER BY id DESC 
      FOR XML PATH('details') 
     ) as xml) as d, 
     1 as [Level] 
UNION ALL 
SELECT CAST((
      SELECT id, 
        [name], 
        cast(r.d as xml) 
      FROM [sample] 
      WHERE s.id = id 
      FOR XML PATH('details') 
     ) as xml) as d, 
     r.[Level]+1 
FROM [sample] s 
INNER JOIN rec r 
    ON s.id = CAST(r.d.query('/details/id/text()') as nvarchar(max))-1 
) 

SELECT TOP 1 WITH TIES d 
FROM rec 
ORDER BY [Level] desc 

相同的輸出。

+0

奇怪的格式,但這不是你的錯...... greate解決方案! – Shnugo

+0

更好,不能upvote兩次... – Shnugo

+0

謝謝@Shnugo!我認爲第一個有點複雜,可以用遞歸CTE完成。是的!它可以 – gofr1

0

您可以使用這樣的查詢:

SELECT 
    *, 
    (SELECT 
     * 
    FROM #details 
    WHERE id = 2 
    FOR xml PATH ('Details'), TYPE) 
FROM #details 
WHERE id = 1 
FOR xml PATH ('Details') 

對於內環您可以使用CTE

表創建腳本:

CREATE TABLE #details (
    id int, 
    name varchar(10) 
) 

INSERT INTO #details (id, name) 
    VALUES (1, 'test'), (2, 'test2') 
+0

我只給出樣本數據。我有超過2行 – Sathish

+0

正如我所說的遞歸循環,你需要使用基於你的邏輯的CTE。在這裏,我只是硬編碼如何做嵌套xml –

+0

如何在xml中使用CTE可以顯示示例 – Sathish