J'utilise ce grand exemple /dba//a/25818/113298 de Bluefeet, pour créer un pivot et le transformer en données xml.
Déclarer le param
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
Ensuite, il y a un CTE avec beaucoup de code, le résultat final du CTE est mis dans une base de données temporaire (comme dans l'exemple)
SELECT
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Génération des cols (comme dans l'exemple)
SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120))
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
L'ensemble de résultats est ce à quoi je devais m'attendre
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) p
'
EXEC sp_executesql @query ;
Lorsque j'essaie de le transformer en XML, mes attributs ne sont que partiellement convertis
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 ;
jeu de résultats
<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"
/>
Ai-je raté quelque chose, pourquoi seulement une partie de la date est-elle convertie en unicode?
Comment puis-je réparer cela?
sql-server
xml
pivot
Bunkerbuster
la source
la source
Réponses:
Les noms d'attribut en XML ne peuvent pas commencer par un nombre, voir NameStartChar .
Vous devez trouver des noms alternatifs pour vos attributs et les coder dans une
@cols
variable distincte spécifiant des alias de colonne pour votre requête de pivot dynamique.Résultat;
Lorsque vous utilisez
for xml auto
SQL Server, cela est fait pour vous.la source
Le premier caractère n'est pas Unicode en soi. Je veux dire, techniquement, tous les caractères XML dans SQL Server sont encodés en UTF-16 Little Endian, donc dans ce sens, ils sont tous Unicode. Mais, ce que vous voyez est juste la notation échappée pour un caractère, dans ce cas "2", qui a une valeur hexadécimale / binaire de "32".
Le problème est simplement que les noms XML ne peuvent pas commencer par un nombre. Les tests suivants montrent qu'un nom d'attribut ou un nom d'élément commençant par un nombre obtient une erreur, mais commencer par un trait de soulignement (
_
) ou une lettre est très bien.Vous devez donc préfixer les noms de colonne avec un caractère qui est valide comme caractère initial pour un attribut XML ou un nom d'élément.
De plus, êtes-vous sûr qu'il "fonctionne" avec
FOR XML AUTO
? D'après ce que je peux voir, il s'agit simplement de convertir automatiquement le caractère "invalide" en_x0032_
:Retour:
la source