Comment déclarer un tableau dans Sql Server Stored Procedure?

J’ai besoin de déclarer 12 variables décimales, correspondant à chaque année de mois, avec un curseur.

Je ne sais pas si le serveur SQL a cette syntaxe

Declare MonthsSale(1 to 12) as decimal(18,2) 

Ce code fonctionne bien. !

 CREATE PROCEDURE [dbo].[proc_test] AS BEGIN --SET NOCOUNT ON; DECLARE @monthsales TABLE ( monthnr int, amount decimal(18,2) ) -- PUT YOUR OWN CODE HERE -- THIS IS TEST CODE -- 1 REPRESENTS JANUARY, ... INSERT @monthsales (monthnr, amount) VALUES (1, 100) INSERT @monthsales (monthnr, amount) VALUES (1, 100) INSERT @monthsales (monthnr, amount) VALUES (2, 200) INSERT @monthsales (monthnr, amount) VALUES (3, 300) INSERT @monthsales (monthnr, amount) VALUES (4, 400) INSERT @monthsales (monthnr, amount) VALUES (5, 500) INSERT @monthsales (monthnr, amount) VALUES (6, 600) INSERT @monthsales (monthnr, amount) VALUES (7, 700) INSERT @monthsales (monthnr, amount) VALUES (8, 800) INSERT @monthsales (monthnr, amount) VALUES (9, 900) INSERT @monthsales (monthnr, amount) VALUES (10, 1000) INSERT @monthsales (monthnr, amount) VALUES (11, 1100) INSERT @monthsales (monthnr, amount) VALUES (12, 1200) SELECT monthnr, SUM(amount) AS SUM_MONTH_1 FROM @monthsales WHERE monthnr = 1 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_2 FROM @monthsales WHERE monthnr = 2 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_3 FROM @monthsales WHERE monthnr = 3 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_4 FROM @monthsales WHERE monthnr = 4 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_5 FROM @monthsales WHERE monthnr = 5 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_6 FROM @monthsales WHERE monthnr = 6 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_7 FROM @monthsales WHERE monthnr = 7 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_8 FROM @monthsales WHERE monthnr = 8 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_9 FROM @monthsales WHERE monthnr = 9 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_10 FROM @monthsales WHERE monthnr = 10 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_11 FROM @monthsales WHERE monthnr = 11 GROUP BY monthnr SELECT monthnr, SUM(amount) AS SUM_MONTH_12 FROM @monthsales WHERE monthnr = 12 GROUP BY monthnr -- END TEST CODE END 

Vous pouvez déclarer une variable de table (déclarer une variable de type table):

 declare @MonthsSale table(monthnr int) insert into @MonthsSale (monthnr) values (1) insert into @MonthsSale (monthnr) values (2) .... 

Vous pouvez append des colonnes supplémentaires à votre guise:

 declare @MonthsSale table(monthnr int, totalsales tinyint) 

Vous pouvez mettre à jour la variable de table comme toute autre table:

 update m set m.TotalSales = sum(s.SalesValue) from @MonthsSale m left join Sales s on month(s.SalesDt) = m.MonthNr 

Y a-t-il une raison pour laquelle vous n’utilisez pas une variable de table et l’opérateur SUM global, au lieu d’un curseur? SQL excelle dans les opérations orientées set. 99,87% du temps où vous vous trouvez en utilisant un curseur, il y a une alternative orientée ensemble qui est plus efficace:

 declare @MonthsSale table ( MonthNumber int, MonthName varchar(9), MonthSale decimal(18,2) ) insert into @MonthsSale select 1, 'January', 100.00 union select 2, 'February', 200.00 union select 3, 'March', 300.00 union select 4, 'April', 400.00 union select 5, 'May', 500.00 union select 6, 'June', 600.00 union select 7, 'July', 700.00 union select 8, 'August', 800.00 union select 9, 'September', 900.00 union select 10, 'October', 1000.00 union select 11, 'November', 1100.00 union select 12, 'December', 1200.00 select * from @MonthsSale select SUM(MonthSale) as [TotalSales] from @MonthsSale 

T-SQL ne prend pas en charge les tableaux dont je suis au courant.

Quelle est votre structure de table? Vous pourriez probablement concevoir une requête qui le fait à la place:

 select month, sum(sales) from sales_table group by month order by month 

Bonne question et bonne idée, mais en SQL, vous devrez le faire:

Pour le type de données datetime, quelque chose comme ça-

 declare @BeginDate datetime = '1/1/2016', @EndDate datetime = '12/1/2016' create table #months (dates datetime) declare @var datetime = @BeginDate while @var < dateadd(MONTH, +1, @EndDate) Begin insert into #months Values(@var) set @var = Dateadd(MONTH, +1, @var) end 

Si tout ce que vous voulez vraiment, ce sont des chiffres, faites ceci -

 create table #numbas (digit int) declare @var int = 1 --your starting digit while @var < = 12 --your ending digit begin insert into #numbas Values(@var) set @var = @var +1 end