จะประกาศอาร์เรย์ภายใน MS SQL Server Stored Procedure ได้อย่างไร?


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, 'มกราคม', 100.00), (2, 'กุมภาพันธ์', 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 นั้นกระชับกว่า (เลือก v จาก T โดยที่ Ti = n) จริงๆแล้วมันรวบรัดกว่านี้เยอะ ฉันอยากเห็น T-SQL เพิ่ม
debater

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.