我使用的是来自Bluefeet的出色示例/dba//a/25818/113298,以创建数据透视并将其转换为xml数据。
声明参数
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
接下来是具有大量代码的CTE,将CTE的结果放入临时DB(与示例中相同)
SELECT
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
生成col(与示例相同)
SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120))
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
结果集是我应该期望的
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) p
'
EXEC sp_executesql @query ;
当我尝试将其转换为XML时,我的属性仅被部分转换
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 ;
结果集
<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"
/>
我是否错过了某些内容,为什么只将日期的一部分转换为unicode?
我怎样才能解决这个问题?
这是哪个版本的SQL Server?
—
ypercubeᵀᴹ
Sql Server 2012,但这不是重点,在这种情况下,重要的是xml的规范
—
Bunkerbuster 2016年
这似乎是一个XY问题。即使按预期工作,在XML中使用日期作为属性名称似乎也不建议。我更倾向于将日期存储为属性的值或元素的文本,具体取决于我打算如何处理。如有必要,我将使用多个具有成对属性的元素。
—
jpmc26 2013年