La sortie du contenu de la table SQL Server dans une ligne avec le total final contient des balises XML indésirables

J'ai une table de données dans MS SQL Server dont le contenu je dois formater dans une seule ligne, avec un logging de remorque contenant le nombre d'loggings. J'utilise la command for-xml-path de T-SQL pour créer la string mais la sortie contient des balises XML que je dois supprimer.

Le script suit:

create table #data ( record_id int identity(10000,1) primary key, create_ts datetime not null default current_timestamp, transit varchar(20), ); insert into #data (transit) values (12345); insert into #data (transit) values (5432); with records as ( select ( right('00000' + rsortingm(transit), 5) + convert(varchar, create_ts, 12) ) as val from #data where datediff(hh, create_ts, getdate()) <= 24 ) select * from records union all select ( + convert(varchar, GetDate(), 12) + right('00000000000' + convert(varchar, count(*)), 11) ) from records for xml path(''); 

Je vois cette sortie:

 <val>12345140710</val><val>05432140710</val><val>14071000000000002</val> 

mais la sortie ne doit pas inclure les balises XML:

 123451407100543214071014071000000000002 

Quel changement dois-je faire pour faire ceci?

Les balises dans la sortie sont le résultat du fait que la colonne produite par la requête a un nom. Donc, vous pouvez simplement en faire une colonne sans nom pour éliminer les balises.

Pour ce faire, vous pouvez replace le * dans votre requête d'origine par quelque chose comme val + '' :

 with records as ( select ( right('00000' + rsortingm(transit), 5) + convert(varchar, create_ts, 12) ) as val from #data where datediff(hh, create_ts, getdate()) <= 24 ) select val + '' from records union all select ( + convert(varchar, GetDate(), 12) + right('00000000000' + convert(varchar, count(*)), 11) ) from records for xml path(''); 

Et vous obtiendriez la sortie que vous vouliez:

 123451407100543214071014071000000000002 

Comme toujours, je trouve ma propre réponse après avoir posté sur StackOverflow. J'ai résolu cela en copiant datatables brutes (par opposition aux données formatées) dans la table temporaire et tout formaté dans la sélection finale:

 with records as ( select * from #data where datediff(hh, create_ts, getdate()) <= 24 ) select ( select right('00000' + rsortingm(transit), 5) + convert(varchar, create_ts, 12) from records for xml path('') ), ( convert(varchar, GetDate(), 12) + right('00000000000' + convert(varchar, count(*)), 11) ) from records for xml path(''); 

La sortie est maintenant:

 123451407100543214071014071000000000002