J'ai le CTE suivant. Son but est de fournir des paires mois/année uniques. Le code ultérieur utilisera le CTE pour produire une liste de chaînes concaténées des paires Mois/Année.T-SQL - comment contourner l'ordre par restriction dans les CTE
;WITH tblStoredWillsInPeriod AS
(
SELECT DISTINCT Kctc.GetMonthAndYearString(DateWillReceived) Month
FROM Kctc.StoredWills
WHERE DateWillReceived BETWEEN '2010/01/01' AND '2010/03/31'
ORDER BY DateWillReceived
)
Je l'ai omis implmementation de la fonction GetMonthAndYearString comme il est trivial.
Edit: Comme demandé par Martin, voici le code environnant:
DECLARE @PivotColumnHeaders nvarchar(MAX)
--CTE declaration as above---
SELECT @PivotColumnHeaders =
COALESCE(
@PivotColumnHeaders + ',[' + Month + ']',
'[' + Month + ']'
)
FROM tblStoredWillsInPeriod
SELECT @PivotColumnHeaders
Malheureusement, il semble T-SQL est toujours une longueur d'avance. Quand je lance ce code, il me dit que je ne suis pas autorisé à utiliser ORDER BY dans un CTE sauf si j'utilise aussi TOP (ou FOR XML, quel qu'il soit.) Si j'utilise TOP, il me dit que je ne peux pas l'utiliser avec DISTINCT. Oui, T-SQL a toutes les réponses.
Quelqu'un peut-il penser à une solution à ce problème qui est plus rapide que de simplement couper mes poignets? Je comprends que la mort par la perte de sang peut être étonnamment longue, et j'ai des délais à respecter.
Merci pour votre aide.
David
Pouvez-vous poster le code qui utilise le CTE? Et aussi le format de la valeur renvoyée par GetMonthAndYearString? Vous dites que vous essayez de l'utiliser comme ici http://www.kodyaz.com/articles/t-sql-pivot-tables-in-sql-server-tutorial-with-examples.aspx. Vous êtes conscient qu'un CTE est seulement dans la portée de la déclaration suivante de toute façon? Ainsi, au moment où vous avez rempli @PivotColumnHeaders, il sera hors de portée pour le bit suivant. –
GetMonthAndYearString renvoie un varchar (8) au format MMM-YYYY. Je suis conscient des limites de la portée des CTE - le code environnant que j'ai maintenant fourni des comptes pour cela. – David