Saya menggunakan contoh hebat ini /dba//a/25818/113298 dari Bluefeet, untuk membuat pivot dan mengubahnya menjadi data xml.
Mendeklarasikan param
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
Berikutnya ada CTE dengan banyak kode, hasil akhir CTE dimasukkan ke dalam temp DB (sama seperti pada contoh)
SELECT
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Menghasilkan col (sama seperti contoh)
SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120))
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
Set hasil adalah apa yang harus saya harapkan
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) p
'
EXEC sp_executesql @query ;
Ketika saya mencoba mengubahnya menjadi XML, atribut saya hanya dikonversi sebagian
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 ;
resultset
<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"
/>
Pernahkah saya melewatkan sesuatu, mengapa hanya sebagian dari tanggal yang dikonversi menjadi unicode?
Bagaimana saya bisa memperbaikinya?
sql-server
xml
pivot
Bunkerbuster
sumber
sumber
Jawaban:
Nama atribut dalam XML tidak diizinkan untuk memulai dengan angka, lihat NameStartChar .
Anda harus membuat nama alternatif untuk atribut Anda dan menyandikannya dalam
@cols
variabel yang menentukan alias untuk kueri pivot dinamis Anda.Hasil;
Ketika Anda menggunakan
for xml auto
SQL Server melakukannya untuk Anda.sumber
Karakter pertama bukan Unicode, per se. Maksud saya, secara teknis semua karakter dalam XML dalam SQL Server dikodekan sebagai UTF-16 Little Endian, jadi dalam pengertian itu mereka semua adalah Unicode. Tapi, apa yang Anda lihat hanyalah notasi yang lolos untuk karakter, dalam hal ini "2", yang memiliki nilai hex / biner "32".
Masalahnya hanyalah bahwa nama XML tidak dapat dimulai dengan angka. Tes berikut menunjukkan bahwa nama atribut atau nama elemen dimulai dengan angka mendapat kesalahan, tetapi dimulai dengan garis bawah (
_
) atau huruf baik-baik saja.Jadi, Anda perlu awalan nama kolom dengan karakter yang valid sebagai karakter awal untuk atribut XML atau nama elemen.
Juga, apakah Anda yakin itu "bekerja" dengan
FOR XML AUTO
? Dari apa yang saya lihat, itu hanya secara otomatis mengkonversi karakter "tidak valid" ke_x0032_
:Pengembalian:
sumber