Comment sortinger une colonne dans la sous-requête

J'ai une requête:

select distinct ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) from CRM for xml path(''); 

Cela fonctionne bien et donnez-moi cette string:

 ,[22 Jul 2013],[28 Jul 2013],[03 Aug 2013],[13 Aug 2013],[30 Jul 2013],[23 Jul 2013],[31 Jul 2013],[19 Jul 2013],[05 Aug 2013],[12 Aug 2013],[26 Jul 2013],[18 Jul 2013],[09 Aug 2013],[20 Jul 2013],[25 Jul 2013],[08 Aug 2013],[11 Aug 2013],[07 Aug 2013],[29 Jul 2013],[06 Aug 2013],[02 Aug 2013],[24 Jul 2013],[17 Jul 2013],[14 Aug 2013],[01 Aug 2013],[21 Jul 2013],[10 Aug 2013],[04 Aug 2013],[27 Jul 2013],[16 Jul 2013] 

Le problème est qu'il ne sortingera pas la colonne en tant que Date mais en tant que string. J'ai essayé de sortinger la colonne à l'intérieur de la requête interne:

 select distinct ',' + quotename(dt) from (select CONVERT(VARCHAR(11), createDate, 113) as dt from crm order by dt asc) for xml path(''); 

mais pas de succès, il dit:

Erreur 1033: La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP ou FOR XML est également spécifié.

Quelqu'un s'il vous plaît aidez-moi à régler ce problème? Merci beaucoup d'avance, j'apprécie toute aide!

Cela fonctionne très bien si vous utilisez un group by plutôt que distinct :

 select ',' + quotename(CONVERT(VARCHAR(11), createDate, 113)) from crm group by CONVERT(VARCHAR(11), createDate, 113) order by CONVERT(datetime, CONVERT(VARCHAR(11), createDate, 113), 113) for xml path(''); 

Spécifiez le top 100 percent dans la sous-requête pour autoriser la command:

 (select top 100 percent CONVERT(VARCHAR(11), createDate, 113) as dt from crm order by dt asc) 

Vous pouvez également omettre entièrement la sous-requête. Le distinct nécessite que vous sortingez sur la colonne exacte que vous select:

 select distinct ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) from CRM order by ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) for xml path(''); 

EDIT: En réponse à votre commentaire, vous pouvez order sur createDate au lieu de dt :

 select distinct ',' + quotename(dt) from ( select top 100 percent CONVERT(VARCHAR(11), createDate, 113) as dt from crm order by createDate ) for xml path('') 

En raison de la distinct , cela ne fonctionne qu'avec une sous-requête.