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


85

이 변수에 값을 합산 한 커서로 매달 연도에 해당하는 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

답변:


143

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

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

26

커서 대신 테이블 변수와 집계 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

12
분명히 MSSQL2012에서는 이제 다음 형식으로 삽입 할 수 있습니다. VALUES (1, 'January', 100.00), (2, 'February', 200.00)-출처 : blog.sqlauthority.com/2012/10/27/…
andrewb

3
이 기능은 내주의를 완전히 피했습니다. SQL 2008에서도 작동합니다.
Paul Smith

8

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

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

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

부수적으로 만 T [n] .v 구문이 (Ti = n 인 경우 T에서 v를 선택하십시오)보다 약간 더 간결하다는 점에 주목합니다. 사실 훨씬 더 간결합니다. T-SQL이 추가하는 것을보고 싶습니다.
토론자

3

좋은 질문과 좋은 아이디어이지만 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.