如何在Sql Server存储过程中声明数组?
我需要声明12个十进制variables,对应于每个月的年份,用一个游标我总结这个variables的值,然后我更新一些销售信息。
我不知道如果sql服务器有这个语法
Declare MonthsSale(1 to 12) as decimal(18,2)
这段代码工作正常。 !
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
你可以声明一个表variables(声明一个表types的variables):
declare @MonthsSale table(monthnr int) insert into @MonthsSale (monthnr) values (1) insert into @MonthsSale (monthnr) values (2) ....
你可以添加额外的列,只要你喜欢:
declare @MonthsSale table(monthnr int, totalsales tinyint)
您可以像更新其他表一样更新表variables:
update m set m.TotalSales = sum(s.SalesValue) from @MonthsSale m left join Sales s on month(s.SalesDt) = m.MonthNr
是不是有一个原因,你不使用表variables和聚合SUM运算符,而不是一个游标? SQL擅长面向集合的操作。 99.87%的时间,你发现自己使用游标,有一个更有效的面向集合的select:
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不支持我知道的数组。
你的桌子结构是什么? 你可以devise一个查询来代替:
select month, sum(sales) from sales_table group by month order by month
伟大的问题和伟大的想法,但在SQL中,你需要做到这一点:
对于数据types的date时间,像这样的东西 –
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
如果你真的想要的只是数字,
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