Wednesday, March 7, 2012

การใช้ Temp table ใน SQL server

วันนี้ขอนำเสนอความรู้เกี่ยวกับ SQL server 2000 -2005 ในเรื่องของการ
สร้าง Temp Table ในการเขียน Store Procedure กันคะ

หลายคนคงไม่รู้จักว่ามันคืออะไร Temp Table คล้ายกับการสร้าง Table ปกติคะ เพียงแต่มันเป็น Temp ที่ถูกสร้างขึ้นมาในขณะนั้น เท่านั้น ไม่ได้เป็น Table ที่ถูกสร้างขึ้นจริง การใช้งาน Temp Table มีประโยชน์มากในการนำไปเขียน Store Procedure ท่านใดที่ยังไม่เคยลองนำไปประยุกต์ใช้ ท่านจะพบว่ามันช่วยแก้ปัญหาที่ซับซ้อน และแก้ไขปัญหาเรื่องการเรียกข้อมูลจำนวนมากๆ จากการทำงาน รวมถึงลดภาระการสร้าง table ต่างๆที่ไม่จำเป็น นอกจากนั้นยังยืดหยุ่นต่อการเพิ่มจำนวน field โดยที่ไม่ต้องไปยุ่งกับโครงสร้างของ เทเบิ้ลจริงแต่อย่างใด

ด้วยการเขียนคำสั่งเพียงคำสั่งชุดเดียว มันอาจทำให้การแสดงผลช้า วิธีการใช้ temp table ก็คือ 
ตัวอย่างคำสั่งในการสร้าง จึงเหมือนกับการ Create table ธรรมดาๆ เพียงแต่....

ตัวอย่าง การสร้าง Temp Table
create table #temp
(
name varchar(30),
surname varchar(50)
)

จะสังเกตได้ว่าการสร้าง Temp Table ต่างจากการเขียนคำสั่งสร้าง Table ธรรมดาตรงที่ ต้องมีเครื่องหมาย # อยู่ข้างหน้าเสมอ
สุดท้ายเมื่อใช้งาน Temp Table เสร็จแล้ว ก็ควรจะ เขียนคำสั่ง

drop table #temp 

หลังจากที่ใช้งานทุกอย่างเสร็จแล้วนะคะเพื่อเป็นการคืนทรัพยากรให้ระบบ

ขอยกตัวอย่าง นะคะ เช่น
ถ้าคุณจำเป็นต้องแสดงข้อมูล โดยการ join ข้อมูลจาก 5 table ดังนี้ 
(ขอยกตัวอย่างที่ไม่ละเอียดมากนักนะคะ )

book_Master -- เก็บ book_name , ID_book
Price_Master -- เก็บ ID_Book , Per_unit
Count_stock -- เก็บ ID_Book , date , book_in_stock
Sell_history -- เก็บ ID_Book , order_sell , date_sell
Period -- เก็บ month , month_thai

ซึ่งข้อมูลในแต่ละ Table นั้นมีมากมายมหาศาล

ต้องการเขียน Store Procedure เพื่อเก็บข้อมูล ชื่อ ของหนังสือ(book_name) ,ชื่อวันเดือนปีเดือนภาษาไทย (date) , ราคาหนังสือต่อเล่ม(Per_unit) ,ยอดการสั่งซื้อในเดือนนั้นๆ (order_sell), จำนวนเงินรวมทั้งหมด(Total) ,จำนวนหนังสือที่เหลืออยู่ (stock)

คุณอาจจะเขียนด้วยคำสั่งดังต่อไปนี้ 

create proc Show_History
(
@book_ID varchar(50),
@Date_order varchar(8) --สมมติให้รับค่าเป็น '16052552'

As
Begin
Set NoCount ON

insert into Show_History
select A.ID_book ,
A.book_name , 
E.month_thai,
substring (@Date_order,5,4) As year,
D.order_sell,
B.Per_unit,
isnull(order_sell ,0.0) * isnull(per_unit ,0.0) As Total,
isnull(C.count_stock,0.0) - isnull(D.order_sell,0.0) As stock
from book_Master A,
Price_Master B, 
count_stock C, 
Sell_history D , 
Period E
where A.ID_Book = @book_ID 
and A.ID_Book = B.ID_book
and A.ID_Book = C.ID_Book 
and A.ID_Book = D.ID_Book 
and E.month = substring((@Date_order,2,2) 

Set NoCount Off
End

ทีนี้ลองมาดูการสร้าง procedure ด้วย Temp Table กัน

create proc Show_History
(
@book_ID varchar(50),
@Date_order varchar(8) --สมมติให้รับค่าเป็น '16052552'

As
Begin
Set NoCount ON

create table #Show_history
(
ID_book varchar(10) ,
book_name varchar(50) , 
month_thai varchar(10) ,
year varchar(4) ,
order_sell int ,
Per_unit numeric(10,8),
Total numeric(10,8),
stock int
)

insert into #Show_history (ID_book, book_name ,year, order_sell, 
Per_unit ,Total )
select A.ID_book , A. book_name , substring (@Date_order,5,4),
D.order_sell, B.Per_unit, isnull(order_sell ,0.0)*isnull 
(per_unit ,0.0) 
from book_Master A,
Price_Master B,
Sell_history D 
where A.ID_Book = @book_ID 
and A.ID_Book = B.ID_book 
and A.ID_Book = D.ID_Book 

update T
set T.month_thai = E.month 
from Period E, #Show_history T
where E.month = substring((@Date_order,2,2) 

update #Show_history 
set Total = isnull(C.count_stock,0.0) - isnull(T.order_sell,0.0) 
from #Show_history T, count_stock C
where T.ID_book = C.ID_book

select * from #Show_history

drop table #Show_history

Set NoCount Off
End

จากตัวอย่างการเขียน โดยการใช้ Temp Table เข้ามาช่วยจะทำให้เราสามารถ ยืดหยุ่น ในการแสดงข้อมูลได้มากขึ้นและเรียกดูข้อมูลได้ไวขึ้น ซึ่งบางครั้ง ถ้าคุณต้องการเพิ่ม field ในภายหลังก็สามารถเพิ่มได้ตรงช่วงของการ create table #show_history ได้เลย โดยถ้าหากคุณไม่ใช้ Temp table นี้ คุณอาจจะต้องไปนั่งแก้โครงสร้างของ Table ซึ่งบางทีอาจจะกระทบกับ table อื่นๆที่เป็น table จริงๆ โดยไม่รู้ตัว

No comments:

Post a Comment