Stocker des dates dans une seule colonne en sql par transpose?

J'essaie de générer une seule colonne qui a une list de dates pour les fins de divers mois, plus la date d'aujourd'hui. Jusqu'à présent j'ai:

DECLARE @date DATETIME = '7/1/2016'; SELECT CONVERT(char(10), GetDate(),126) ,EOMONTH ( @date, 1 ) ,EOMONTH (@date, 2) ,EOMONTH (@date, 3) ,EOMONTH (@date, 4) ,EOMONTH (@date, 5) ,EOMONTH (@date, 6) ,EOMONTH (@date, 7) ,EOMONTH (@date, 8) ,EOMONTH (@date, 9) ,EOMONTH (@date, 10) ,EOMONTH (@date, 11) ,EOMONTH (@date, 12) ; GO 

Mais cela me donne une sortie où chaque résultat est une nouvelle colonne. Existe-t-il un moyen de transposer cette sortie de sorte qu'il ne s'agisse que d'une colonne et que chaque nouveau résultat est une nouvelle ligne?

Si je comprends bien, je voudrais juste utiliser des VALUES .

 DECLARE @date DATETIME = '2016-07-01'; SELECT v.* FROM (VALUES (@date), (EOMONTH(@date, 1)) , (EOMONTH(@date, 2)), (EOMONTH(@date, 3)), (EOMONTH(@date, 4)), (EOMONTH(@date, 5)), (EOMONTH(@date, 6)), (EOMONTH(@date, 7)), (EOMONTH(@date, 8)), (EOMONTH(@date, 9)), (EOMONTH(@date, 10)), (EOMONTH(@date, 11)), (EOMONTH(@date, 12)) ) v(dte); 

Une façon de le faire est d'utiliser un cte récursif:

 DECLARE @date DATE = '2016-07-01'; ;WITH CTE AS ( SELECT 1 As n UNION ALL SELECT n + 1 FROM CTE WHERE n < 12 ) SELECT n, EOMONTH (@date, n) FROM CTE 

Voir une démo en direct sur rextester

Un autre moyen, et probablement le meilleur, est d'utiliser une table de pointage.
Si vous ne savez pas ce qu'est une table de pointage et pourquoi c'est bon pour vous, lisez cet article de Jeff Moden .

Si vous n'avez pas encore de table de pointage, créez-en une:

 SELECT TOP 10000 IDENTITY(int,1,1) AS Number INTO Tally FROM sys.objects s1 CROSS JOIN sys.objects s2 ALTER TABLE Tally ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number) 

Alors votre code est aussi simple que ça:

 DECLARE @date DATE = '2016-07-01'; SELECT Number, EOMONTH (@date, Number) FROM Tally WHERE Number < 13 

Démonstration en direct pour une table de pointage

Exemple

 Declare @Date date = '7/1/2016'; Declare @Mnth int = 12 -- << Optional allows you to define the # of months Select D = @Date Union All Select Top (@Mnth) EOMonth(@Date,Row_Number() Over (Order By (Select NULL))) From master..spt_values -- << Virtually any Table Will Do 

Résultats

 D 2016-07-01 2016-08-31 2016-09-30 2016-10-31 2016-11-30 2016-12-31 2017-01-31 2017-02-28 2017-03-31 2017-04-30 2017-05-31 2017-06-30 2017-07-31