[sql-server-2008] MS SQL Server 저장 프로 시저 내에서 배열을 선언하는 방법은 무엇입니까?

이 변수에 값을 합산 한 커서로 매달 연도에 해당하는 12 개의 십진 변수를 선언해야합니다. 그런 다음 나중에 일부 판매 정보를 업데이트합니다.

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



답변

테이블 변수를 선언 할 수 있습니다 (테이블 유형의 변수 선언).

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


답변

커서 대신 테이블 변수와 집계 SUM 연산자를 사용하지 않는 이유가 있습니까? 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


답변

T-SQL은 내가 아는 배열을 지원하지 않습니다.

테이블 구조는 무엇입니까? 대신이 작업을 수행하는 쿼리를 디자인 할 수 있습니다.

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


답변

좋은 질문과 좋은 아이디어이지만 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


답변