SQL Server FOR XML-Pfad machen sich wiederholende Knoten

8

Ich möchte die folgende Ausgabe mithilfe von SQL Server 2012 generieren:

%Vor%

Von drei verschiedenen Spalten in derselben Tabelle (wir nennen sie col1, col2 und col3).

Ich versuche diese Abfrage zu verwenden:

%Vor%

Aber was ich bekomme ist das:

%Vor%

Was mache ich hier falsch?

    
Dan Field 16.03.2015, 23:03
quelle

5 Antworten

12

Fügen Sie eine Spalte mit NULL als Wert hinzu, um einen separaten Elementknoten für jede Spalte zu generieren.

%Vor%

Ergebnis:

%Vor%

SQL Fiddle

Warum funktioniert das?

Spalten ohne Namen werden als Textknoten eingefügt. In diesem Fall wird der NULL-Wert als Textknoten zwischen den item -Knoten eingefügt.

Wenn Sie tatsächliche Werte anstelle von NULL hinzufügen, sehen Sie, was passiert.

%Vor%

Ergebnis:

%Vor%

Eine weitere Möglichkeit, eine Spalte ohne Namen anzugeben, besteht darin, das Platzhalterzeichen * als Spaltenalias zu verwenden.

Spalten mit einem Namen, der als Platzhalterzeichen angegeben ist

In diesem Fall ist es nicht erforderlich, den Platzhalter zu verwenden, da die Spalten mit NULL-Werten keinen Spaltennamen haben. Sie sind jedoch nützlich, wenn Sie Werte aus tatsächlichen Spalten wünschen, der Spaltenname jedoch nicht Knotenname.

    
Mikael Eriksson 24.03.2015, 13:36
quelle
4

Ok, du kannst den Pfad dafür nicht benutzen. Verwenden Sie stattdessen explizit

%Vor%     
sanmis 16.03.2015 23:59
quelle
3

Es gibt tatsächlich einige Möglichkeiten, dies mit der XML-Pfad-Syntax zu lösen.

Die erste besteht darin, zuerst die Ergebnisse zu veröffentlichen, zum Beispiel:

%Vor%

Die 2. erfordert nicht das Unpivot, sondern wiederholt mehr von Ihrer Abfrage:

%Vor%

Beide kombinieren mehrere Datenzeilen unter demselben übergeordneten Knoten. Wenn Sie zum Beispiel 2 Zeilen haben, die erste mit 1,2,3 und die zweite 4,5,6, erhalten Sie:

%Vor%

Wenn Sie stattdessen möchten, dass jede Zeile, die Sie aufheben, ein eindeutiges Elternelement pro Zeile hat, nehmen Sie an, dass Sie in jeder Zeile eine Zeilenkennung haben (ich nenne sie parentId) diese Ansätze optimieren:

%Vor%

oder

%Vor%

Was dazu führen würde:

%Vor%

Sql Geige mit Demo

    
lheria 17.03.2015 02:13
quelle
1

Ein paar Anmerkungen hier: Wenn Sie FOR XML EXPLICIT verwenden, können Sie WITH XMLNAMESPACES nicht verwenden (eine Anforderung, die ich nicht erwähnt habe, also lasse ich immer noch die akzeptierte Antwort). Während Iherias Antwort auch sehr hilfreich war, gibt es eine andere einfachere Möglichkeit, die ich seither erkannt habe:

%Vor%

Ich denke, dies ist wahrscheinlich der einfachste und performanteste Weg (ich habe es nicht bewertet, aber ich kann mir nicht vorstellen, UNPIVOT zu verwenden wäre schneller und, falls überhaupt, wird die multiple SELECT -Option wahrscheinlich umgestaltet dies durch den Motor sowieso).

    
Dan Field 24.03.2015 13:13
quelle
-2

Ich denke, wenn Sie den Alias ​​der Spalten so ändern, sollte es funktionieren. Dies liegt daran, dass die Aliase identisch sind und der Datentyp der Daten gleich sein kann. Falls Sie unterschiedliche Daten in Spalte1, Spalte2 und Spalte3 haben, sollte dieses Verhalten nicht angezeigt werden.

%Vor%     
sanmis 16.03.2015 23:19
quelle

Tags und Links