Estoy usando este gran ejemplo /dba//a/25818/113298 de Bluefeet, para crear un pivote y transformarlo en datos xml.
Declarando el param
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
Luego hay un CTE con mucho código, el resultado final del CTE se coloca en una base de datos temporal (igual que en el ejemplo)
SELECT
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Generando los cols (igual que el ejemplo)
SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120))
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
El conjunto de resultados es lo que debería esperar
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) p
'
EXEC sp_executesql @query ;
Cuando intento transformarlo a XML, mis atributos solo se convierten parcialmente
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 ;
conjunto resultante
<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"
/>
¿Me he perdido algo? ¿Por qué solo una parte de la fecha se convierte a Unicode?
¿Cómo puedo arreglar esto?
sql-server
xml
pivot
Bunkerbuster
fuente
fuente
Respuestas:
Los nombres de atributos en XML no pueden comenzar con un número, consulte NameStartChar .
Debe encontrar nombres alternativos para sus atributos y codificarlos en una
@cols
variable separada que especifique los alias de columna para su consulta dinámica dinámica.Resultado;
Cuando usa
for xml auto
SQL Server, lo hace por usted.fuente
El primer personaje no es Unicode, per se. Quiero decir, técnicamente todos los caracteres en XML dentro de SQL Server están codificados como UTF-16 Little Endian, por lo que en ese sentido son todos Unicode. Pero, lo que está viendo es solo la notación escapada de un personaje, en este caso "2", que tiene un valor hexadecimal / binario de "32".
El problema es simplemente que los nombres XML no pueden comenzar con un número. Las siguientes pruebas muestran que un nombre de atributo o nombre de elemento que comienza con un número obtiene un error, pero comenzar con un guión bajo (
_
) o una letra está bien.Por lo tanto, debe anteponer los nombres de columna con un carácter que sea válido como carácter inicial para un atributo XML o nombre de elemento.
Además, ¿estás seguro de que está "trabajando"
FOR XML AUTO
? Por lo que puedo ver, es simplemente convertir automáticamente el carácter "no válido" a_x0032_
:Devoluciones:
fuente