2016-09-23 6 views
1

Tabellenname: ProbeErstellen von XML mit demselben Tag-Namen

Spaltenname: id, name

Jede Zeile erstellen Separate Tag mit nach innen.

Zeigen Sie den XML-Wert wie dieser

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

ich so versucht, aber es ist nicht

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

Wie diese XML-Ausgabe erhalten?

+0

Warum kommt die Knoten-ID mit dem Wert 2 ins Innere? es ist gleich Rekord wie 1? –

+0

@KannanKandasamy Ich brauche dieses Format. Jede Zeile kommt innerhalb Tag alle kommt in End-XML. Wenn ich 4 Reihen 4 habe, kommt Ende.

Tag Start in jeder Zeile Werte – Sathish

Antwort

2

Es hartcodiert ist, aber funktionieren sollte:

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] Tisch bekam ich:

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

Ausgang:

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

EDIT

Auch könnte es mit rekursiven CTE erfolgen:

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 

gleicher Leistung.

+0

Seltsames Format, aber das ist nicht deine Schuld ... große Lösung! – Shnugo

+0

Noch besser, kann nicht zweimal upvote ... – Shnugo

+0

Danke @Shnugo! Ich dachte, das erste wäre etwas kompliziert und könnte mit rekursivem CTE gemacht werden. Und ja! Es kann – gofr1

0

Sie können Abfrage wie folgt verwendet werden:

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

Für innere Schleife können Sie CTE verwenden

Tabellenerstellungsskripts:

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

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

Ich gebe nur Beispieldaten. Ich habe mehr als 2 Zeilen – Sathish

+0

Wie ich für rekursive Schleifen gesagt habe, müssen Sie CTE basierend auf Ihrer Logik verwenden. Hier habe ich nur hart codiert, wie verschachtelte XML zu tun –

+0

wie CTE in Xml verwenden können Sie Beispiel – Sathish

Verwandte Themen