代码之家  ›  专栏  ›  技术社区  ›  RicardoBalda

如何在MS SQL Server存储过程中声明数组?

  •  77
  • RicardoBalda  · 技术社区  · 15 年前

    我需要声明12个十进制变量,对应于每个月的年份,用光标i将这些变量的值相加,然后我更新一些销售信息。

    我不知道SQL Server是否有这种语法

     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
    
    4 回复  |  直到 6 年前
        1
  •  132
  •   Knight0fDragon    7 年前

    您可以声明一个表变量(声明一个表类型的变量):

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

    您可以根据需要添加额外的列:

    declare @MonthsSale table(monthnr int, totalsales tinyint)
    

    您可以像更新任何其他表一样更新表变量:

    update m
    set m.TotalSales = sum(s.SalesValue)
    from @MonthsSale m
    left join Sales s on month(s.SalesDt) = m.MonthNr
    
        2
  •  25
  •   Paul Smith    15 年前

    是否有原因不使用表变量和聚合和运算符而不是光标?SQL擅长于面向集的操作。99.87%的时间你发现自己使用光标,有一个面向集的选择,更有效:

    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
    
        3
  •  7
  •   Rahul    11 年前

    T-SQL不支持我知道的数组。

    你的桌子是什么结构?您可能会设计一个执行此操作的查询:

    select
    month,
    sum(sales)
    from sales_table
    group by month
    order by month
    
        4
  •  2
  •   Dane Thomas    8 年前

    好问题和好主意,但在SQL中,您需要这样做:

    对于数据类型datetime,如下所示-

    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