Ich verwende dieses großartige Beispiel /dba//a/25818/113298 von Bluefeet, um einen Pivot zu erstellen und ihn in XML-Daten umzuwandeln.
Den Parameter deklarieren
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
Als nächstes gibt es einen CTE mit viel Code, das Endergebnis des CTE wird in eine temporäre Datenbank gestellt (wie im Beispiel).
SELECT
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Generieren der Spalten (wie im Beispiel)
SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120))
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
Die Ergebnismenge ist das, was ich erwarten sollte
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) p
'
EXEC sp_executesql @query ;
Wenn ich versuche, es in XML umzuwandeln, werden meine Attribute nur teilweise konvertiert
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) p
for xml auto
-- when using for XML path i will get a error
-- FOR XML PATH(''''), ROOT(''root'')
-- Msg 6850, Level 16, State 1, Line 3
-- Column name '2016-12-17' contains an invalid XML identifier
-- as required by FOR XML; '2'(0x0032) is the first character at fault.
'
EXEC sp_executesql @query ;
Ergebnismenge
<p Guid="3C3359E3-CFE5-E511-80CA-005056A90901"
_x0032_016-12-17="2" --> should be 2016-12-17="2"
_x0032_016-12-18="2" --> should be 2016-12-18="2"
_x0032_016-12-19="2" --> should be 2016-12-19="2"
/>
Habe ich etwas verpasst, warum wird nur ein Teil des Datums in Unicode konvertiert?
Wie kann ich das beheben?
sql-server
xml
pivot
Bunkerbuster
quelle
quelle
Antworten:
Attributnamen in XML dürfen nicht mit einer Zahl beginnen, siehe NameStartChar .
Sie müssen alternative Namen für Ihre Attribute finden und diese in einer separaten
@cols
Variablen codieren, die Spaltenaliasnamen für Ihre dynamische Pivot-Abfrage angibt.Ergebnis;
Wenn Sie verwenden
for xml auto
SQL Server verwenden, erledigt dies für Sie.quelle
Das erste Zeichen ist per se kein Unicode. Ich meine, technisch gesehen sind alle Zeichen in XML in SQL Server als UTF-16 Little Endian codiert. In diesem Sinne sind sie alle Unicode. Was Sie jedoch sehen, ist nur die Escape-Notation für ein Zeichen, in diesem Fall "2", das einen Hex / Binär-Wert von "32" hat.
Das Problem ist einfach, dass XML-Namen nicht mit einer Nummer beginnen können. Die folgenden Tests zeigen, dass ein Attribut- oder Elementname, der mit einer Zahl beginnt, einen Fehler erhält, aber mit einem Unterstrich (
_
) oder einem Buchstaben zu beginnen, ist in Ordnung.Daher müssen Sie den Spaltennamen ein Zeichen voranstellen, das als Anfangszeichen für ein XML-Attribut oder einen Elementnamen gültig ist.
Sind Sie auch sicher, dass es "funktioniert"
FOR XML AUTO
? Soweit ich sehen kann, wird das "ungültige" Zeichen einfach automatisch konvertiert in_x0032_
:Kehrt zurück:
quelle