- 1 -
SQL Server 2000 : Bi n c c b
ế ụ ộ
ố
ệ ử ụ
ữ ậ
ư
ế Gi ng nh ngôn ng l p trình khác, vi c s d ng các bi n ng trình là đi u t t y u ph i có bên trong
ề ấ ế
c c b trong ch ụ ộ
ươ
ả
các ng d ng. N u không có bi n thì các ngôn ng l p trình s ế
ữ ậ
ụ
ứ
ế
tr nên không hi u qu , Transaction-SQL cũng không lo i tr
ở
ệ
ả
ẽ ạ ừ
này.
y u t ế ố
ng trình dùng đ l u tr ế ươ ờ các giá tr t m th i trong quá trình tính toán t máy tính thì giá tr c a các ng trình ho c t ể ư ỏ ị ạ ặ ắ ị ủ Bi n trong ch ữ các x lý b i vì sau khi thoát kh i ch ươ ở ử bi n này s khôngc òn trong b nh n a. ớ ữ ế ẽ ộ
ườ ể ư ng m i m t bi n dùng đ l u tr ế ữ ộ ộ ể ư ạ ữ ệ ể ộ ộ ữ ỗ ị ạ ữ ữ ệ ố ữ ệ ư ỗ ấ ạ ế ầ ế ả ạ ẽ ế ế ặ ể ấ ạ ộ ị ộ ỉ ế ụ ộ ỗ ầ ạ ế duy nh t m t lo i d li u. Do đó khi Thông th ế ư m t bi n đã xác đ nh đ l u tr d li u d ng ngày thì b n không th ép bu c bi n l u ạ ế tr các d li u d ng khác nh là s ho c chu i. M i bi n c n ph i có m t tên bi n rõ ràng và duy nh t trong m t ph m vi đ khi c n tham chi u, b n s ch đ nh đ n tên c a bi n đó. Trong Transaction-SQL có hai lo i bi n khác nhau : bi n c c b và bi n ế ế ủ h th ng. ệ ố
ữ ậ ệ ề ế Khác v i các ngôn ng l p trình, Microsoft SQL Server không có khái ni m v bi n ớ toàn c c.ụ
1/- Khai báo bi n c c b :
ế ụ ộ
ệ ố ệ ộ ộ ị ỉ ấ ể ươ ủ ớ ể Khai báo bi n c c b là vi c ch đ nh cho h th ng máy tính c p phát m t vùng nh bên trong b nh RAM (random access memory) c a máy tính đ ch ng trình có th l u tr các giá tr t m th i trong quá trình tính toán. ờ ư ế ụ ớ ộ ị ạ ữ
c khai báo t ệ ử ụ ườ ế ầ ộ ướ ồ ắ ả ộ ng minh rõ ớ c r i sau đó m i c phép s d ng. Đi u này s giúp cho b n hi u rõ v vi c khai báo và s d ng các ử ụ ạ ả ượ ụ ế ề ệ ể ẽ ề Trong Transaction-SQL vi c s d ng bi n c n ph i đ ràng, có nghĩa là b t bu c b n c n ph i khai báo bi n c c b tr ầ ạ đ ử ụ ượ bi n bên trong ch ế ng trình c a mình. ủ ươ
ể ế ụ ộ ạ ử ụ ệ DECLARE v i cúớ Đ khai báo bi n c c b trong Transaction-SQL, b n s d ng l nh pháp nh sau : ư
Cú pháp :
Trong đó :
- 2 -
c khai báo, tên bi n luôn luôn b t đ u b ng ký t @. ủ ế ượ ắ ầ ế ằ ự • Tên bi n :ế tên c a bi n đ Thông th ng tên bi n ph i duy nh t trong m t ph m vi ho t đ ng. ườ ạ ộ ế ả ấ ạ ộ
ữ ệ ể ơ ả ủ ỉ ể ặ ế ẽ ư ệ ạ ữ ệ ậ ặ ấ • Ki u d li u : ể ữ ệ là các ki u d li u c b n c a Microsoft SQL Server ho c các ki u ể ữ d li u do ng i dùng đ nh nghĩa, dùng đ ch đ nh lo i d li u mà bi n s l u tr . ị ị ườ ữ ệ Các ki u d li u text, ntext ho c image không đ c ch p nh n trong vi c khai báo ượ ữ ệ ể bi n.ế
Ví d :ụ
ể ư ị ổ ữ ng đ t hàng, h tên nhà cung ọ ặ Đ khai báo các bi n dùng đ l u tr giá tr t ng s l ế ể c p, ngày xu t hàng, b n s d ng l nh ạ ử ụ ấ ệ DECLARE nh sau : ố ượ ư ấ
ớ ở ạ ể ế ộ ị Khác v i m t vài ngôn ng l p trình, b n không th gán giá tr kh i t o cho bi n lúc khai báo chúng. Do đó, hành đ ng k ti p là gán giá tr c n l u tr vào bên trong bi n. ạ ế ế ữ ậ ộ ị ầ ư ữ ế
2/- Gán giá tr cho bi n :
ế
ị
ử ụ ữ ệ SET ho c l nh ặ ệ ị ụ ể ỉ ể ặ SELECT cùng Đ gán tr c n l u tr vào các bi n, b ng s d ng l nh ạ ế ị ầ ư ể ng l nh SET ch đ gán các giá tr c th ho c các bi u v i phép gán (=). Thông th ể ớ ệ ườ các bi n khác. th c tính toán ho c giá tr tính toán t ế ừ ặ ứ ị
Ví d :ụ
c khai báo theo ví d ể ế ấ ị ượ ụ Đ gán giá tr là ngày 25/03/2002 vào bi n ngày xu t hàng đã đ SET nh sau : trên, b n s d ng l nh ư ạ ử ụ ệ
L u ý : ư
ạ ử Đ i v i ki u d li u d ng ngày trong Microsoft SQL Server thông th ố ớ d ng theo đ nh d ng yyyy-mm-dd đ gán giá tr vào bi n ho c vào trong c s d li u. ể ụ ng b n s ạ ườ ơ ở ữ ệ ữ ệ ạ ể ị ế ặ ị
i v i l nh ượ ạ ớ ệ ị ượ ấ c l ừ ữ ệ ủ SET, l nh ệ ộ ả c l y ra ho c tính ặ d li u c a các c t bên trong các b ng d li u. Ngoài ra trong cùng m t l nh ộ ệ ộ các c t SELECT dùng đ gán các giá tr đ ể ữ ệ ể ừ ồ ị Ng toán t SELECT cho phép cùng lúc đ ng th i b n có th gán các giá tr khác nhau t ờ ạ d li u vào bên trong các bi n khác nhau. ữ ệ ế
Ví d :ụ
- 3 -
c t SLDAT (s ồ ố ặ ng đ t) trong b ng CTDONDH, b n s d ng l nh Đ tính ra t ng s l ố ượ ể l ả ượ ng đ t hàng mà d li u c a nó đ ữ ệ ạ ử ụ c l y t ượ ấ ừ ộ SELECT nh sau : ư ủ ệ ặ
Ví d :ụ
ng đ t hàng th p nh t và cao nh t, b n ch c n s ị ố ượ ỉ ầ ử ấ ấ ạ ặ ấ SELECT nh sau : Đ tính ra đ ng th i giá tr s l ồ ể d ng duy nh t m t l nh ấ ụ ờ ộ ệ ư
ẩ ế ở ể ả ề ữ ữ ệ ề ỉ ệ ệ ớ ượ ư ữ ế ề ạ t b i vì h th ng s không báo l C n th n khi s d ng câu l nh ử ụ ậ ng h p n u câu l nh trong tr ế ợ ườ c a dòng d li u sau cùng m i đ ủ ữ ệ bi ế ở SELECT đ gán giá tr c n l u tr vào các bi n b i vì ị ầ ư ị SELECT tr v nhi u dòng d li u thì ch có giá tr c l u tr vào bi n. Đi u này làm cho b n không h ề i. ỗ ệ ố ẽ
ố ữ ạ ả ố ợ ng h p này cách t ộ ữ ệ t nh t là b n luôn đ m b o d li u ả ng b n có ườ ạ ệ ặ ế ề WHERE đ l c d li u theo đúng đi u ki n mình c n ho c k t ầ ề Do đó mu n tránh nh ng tr ấ ườ SELECT, thông th c a mình ch tr v duy nh t m t dòng trong câu l nh ấ ủ th s d ng m nh đ ệ ể ọ ữ ệ ể ử ụ i h n s dòng tr v . h p các hàm th ng kê MIN, MAX, SUM đ gi ả ề ợ ỉ ả ề ệ ố ể ớ ạ ố
Ví d :ụ
ng đ t hàng cao nh t c a m t hàng "Đ u DVD Hitachi 1 đĩa" có mã ố ượ ầ là "DD01", b n s d ng l nh ấ ủ ặ SELECT nh sau : Đ tính ra s l ể v t t ậ ư ặ ạ ử ụ ệ ư
Ho cặ
- 4 -
ứ ể ắ ệ SELECT th hai k t h p các m nh đ ế ợ ộ ố ượ ả ệ ặ ng đ t và sau đó k t h p thêm m nh đ ế ợ ủ ệ ế ề ORDER BY DESC dùng đ s p x p ề TOP 1 để ẽ ả ề ộ SELECT s tr v m t ữ ệ ầ ng đ t hàng là l n nh t. Câu l nh ệ d li u gi m d n theo c t s l ầ ữ ệ l y ra thông tin c a dòng đ u tiên. Khi đó d li u c a l nh ủ ấ dòng có giá tr s l ị ố ượ ấ ặ ớ
ặ ơ ổ ạ ữ ệ ể ầ ư ể ạ ậ ỉ M c dù Microsoft SQL Server có c ch t đ ng chuy n đ i ki u nh ng b n không ế ự ộ ể nên s d ng cách này. Do v y khi khai báo bi n, b n c n ch đúng ki u d li u mà ế ử ụ bi n s l u tr . ữ ế ẽ ư
Ví d :ụ
i có ki u không h p l ướ ợ ệ ể ệ , tuy nhiên h th ng v n th c hi n ự ẫ Bi n @TongSoDH bên d ế bình th ng không thông báo l i. Bi n @TongSoDH ph i có ki u là s nguyên INT. ườ ỗ ế ả ố ệ ố ể
3/- Xem giá tr hi n hành c a bi n :
ị ệ
ủ
ế
ư ể ầ ế ị ầ ư ư ạ ề ế ể ạ ữ ữ ế ư ữ ệ ộ Sau khi đ a các giá tr c n l u tr vào bên trong các bi n, b n cũng có th c n xem giá ể ử ụ tr hi n hành mà bi n đang l u tr là bao nhiêu. Đ làm đi u này, b n có th s d ng ị ệ l nh ệ ủ ệ PRINT đ in n i dung mà bi n hi n đang l u tr ra màn hình. Cú pháp c a l nh ể PRINT nh sau : ư
Cú pháp :
Trong đó :
ế ủ ạ ướ ữ ệ ủ ư ị ệ c đó mà b n mu n xem giá tr hi n ố ượ ng n u ki u d li u c a bi n không ph i là ki u chu i ỗ ể ả ế CONVERT để CAST ho c hàm ặ • Tên bi n :ế tên c a bi n đã đ hành đang l u tr . Thôngt h ườ ữ (char ho c varchar) thì b n nên s d ng các hàm ặ ạ chuy n v ki u d li u chu i t ề ể ữ ệ c khai báo tr ế ể ử ụ ng ng. ỗ ươ ứ ể
ể ỗ là m t bi u th c chu i văn b n c n in ra. Đ dài t ả ầ ứ ể ộ ỗ ộ ố ỗ i đa c a chu i ủ • Bi u th c chu i : ứ là 8.000 ký t .ự
- 5 -
Ví d :ụ
ấ ờ ồ ấ t, b n s d ng l nh ể ấ SELECT và PRINT nh sau : Đ tính đ ng th i giá tr s l ị ố ượ qu ra màn hình cho b n bi ế ng đ t hàng th p nh t và cao nh t, sau đó hi n th k t ị ế ặ ạ ử ụ ể ả ư ệ ạ
ể ổ ế CONVERT dùng đ chuy n đ i ki u d li u c a bi n ể (+) dùng ữ ệ ủ ử Trong ví d trên, s d ng hàm ụ @MaxSldat t đ n i các chu i l ể ố ử ụ ể ki u s nguyên (INT) sang ki u chu i (VARCHAR) và toán t ỗ ể ừ ể ố PRINT th hai. i v i nhau trong câu l nh ỗ ạ ớ ứ ệ
4/- Ph m vi ho t đ ng c a bi n : ạ ộ
ủ
ế
ạ
ạ ộ ủ ế ạ ộ i (stored procedure) ho c m t lô (batch) ch a các câu l nh mà bi n đã đ ỉ ằ ệ ộ ạ ượ ứ ế ặ ộ ủ ụ Trong Transaction-SQL ph m vi ho t đ ng c a bi n ch n m bên trong m t th t c n i t c khai báo bên trong đó.
ề ệ ề ậ ặ ộ c biênd ch đ ng th i cùng lúc t ộ ồ ư ị ạ ể ị ệ GO. Đây ch là t khóa đ ch đ nh k t thúc m t lô. khóa ệ c xem nh là m t nhóm t p h p c a m t ho c nhi u câu l nh Khái ni m v lô đ ượ ủ ợ i Microsoft SQL Server và sau Transaction-SQL s đ ờ ẽ ượ đó h th ng s th c thi các câu l nh này ngay sau khi đã biên d ch thành công. Đ ch ỉ đ nh m t lô b n s d ng t ị ẽ ự ạ ử ụ ệ ố ộ ể ỉ ừ ừ ế ộ ỉ ị
Ví d :ụ
B n có m t lô trong Transaction-SQL nh sau : ư ạ ộ
c biên d ch t ộ ẽ ượ ế ạ ị i Microsoft SQL Server vì th khi có ệ i v cú pháp lúc biên d ch thì s không có câu l nh ỗ ề ẽ ị Do các câu l nh trong m t lô s đ ệ ít nh t m t l nh bên trong lô có l ộ ệ ấ c th c thi bên trong lô đó. nào đ ự ượ
Ví d :ụ
- 6 -
ư ư ệ ế ệ ạ ổ trên nh ng n u b n có b sung thêm l nh INSERT mà cú pháp l nh này ượ c khóa VALUES) thì các l nh SELECT bên trong lô này s không đ ẽ ệ Nh ví d ụ ở b sai (thi u t ị ế ừ th c hi n. ệ ự
i : H th ng s xu t hi n thông báo l ấ ệ ố ệ ẽ ỗ
ố ớ ườ ự ế ộ ỗ ẹ ỉ Tuy nhiên đ i v i các l l ỗ l ạ ng h p các i khi th c hi n (run-time) bên trong m t lô n u tr ợ i vi ph m ràng bu c toàn v n d li u thì h th ng Microsoft SQL Server ch ng ng ư ộ ệ ố i và th c hi n ti p các l nh k ti p bên trong lô. i câu l nh gây ra l ệ ỗ ệ ữ ệ ế ế ế ạ ệ ự ệ
Ví d :ụ
ẫ ế ạ ổ khóa ừ ạ ả ử ộ ỉ VALUES trong l nh INSERT s trùng ẹ ẫ ượ c ế ỗ ệ ấ ng. V n ti p ví d trên nh ng n u b n có b sung t ụ ệ ư thì l n này m c dù ch có m i l nh INSERT vi ph m ràng bu c toàn v n (gi ặ ầ khóa chính c t mã nhà cung c p) nh ng các l nh SELECT bên trong lô này v n đ ệ ư ở ộ th c hi n bình th ệ ườ ự
Ví d :ụ
ế ụ ộ ể ấ ự ể ư ặ ầ ộ i c t Ngaydh. Sau cùng in giá tr đ1o ra màn hình. Khai báo m t bi n c c b ki u ngày dùng đ l u ngày đ t hàng g n dây nh t d a trên d li u c a b ng DONDH t ữ ệ ủ ả ạ ộ ị
- 7 -
i n u b n chèn thêm t khóa ệ ố ẽ ể ở ữ ừ ạ ị GO c chia ra làm hai lô và lô th hai s ỗ ế ệ gi a hai l nh ệ ẽ ứ ở H th ng s hi n th thông báo l SELECT và PRINT. B i vì khi đó các l nh này đ không hi u bi n @Ngaydhgn đã đ ượ c khai báo trong lô th nh t. ứ ấ ượ ể ế
L u ý : ư
ố ớ ệ ế ợ ượ Đ i v i các l nh CREATE nh là CREATE DEFAULT, CREATE PROCEDURE, ư CREATE RULE, CREATE TRIGGER, CREATE VIEW không đ ớ c phép k t h p v i l nh khác trong cùng m t lô. ệ ộ
SQL Server 2000 : Bi n h th ng
ệ ố
ế
Không gi ng nh các ngôn gn l p trình khác, Transaction-
ữ ậ
ư
ố
SQL không có khái ni m v bi n toàn c c. Thay vào đó h ề ế
ụ
ệ
th ng Microsoft SQL Server s cung c p cho ng
ệ i l p trình
ố
ẽ
ấ
ườ ậ
danh sách các bi n h th ng. Các bi n h th ng bên trong
ệ ố
ệ ố
ế
ế
Microsoft SQL Server luôn b t đ u b ng hai ch @@ và giá tr ắ ầ
ữ
ằ
ị mà chúng đang l u tr là do h th ng Microsoft SQL Server
ệ ố
ư
ữ
i l p trình không th can thi p tr c ti p đ gán giá tr vào các bi n h
cung c p, ng ấ
ườ ậ
ự ế
ể
ế
ể
ệ
ị
ệ
th ng.ố
1/- Ý nghĩa s d ng
ử ụ
ậ ị ủ ườ ẫ ể ệ ố ạ ả ự ệ ậ
ế c Microsoft SQL Server xây d ng bên trong và ng ượ ể ự ị ệ ướ ự ệ ờ ủ ỉ ệ ử ứ ế ng xuyên s d ng giá tr c a các Khi l p trình trong Transaction-SQL, b n v n th ử ụ c đó. Th t ra các bi n bi n h th ng đ giúp ki m tra k t qu th c hi n các l nh tr ế ệ ể ế ườ i h th ng chính là các hàm đã đ ệ ố l p trình ch vi c tra c u các giá tr hi n th i c a nó đ th c hi n các x lý ti p theo ậ sau đó.
ế ệ ố ườ ổ ị ộ ự ế ệ ng xuyên tùy thu c vào các câu l nh M t vài bi n h th ng có giá tr thay đ i th ộ th c hi n trong Transaction-SQL, tuy nhiên bên c nh đó cũng có m t vài bi n h th ng ệ ố ộ ạ có giá tr r t ít khi thay đ i. ệ ị ấ ổ
- 8 -
ượ ấ c th c hi n trong câu l nh g n nh t. ệ ệ ầ Bi n @ROWCOUNT tr v t ng s m u tin đ Bi n h th ng này có giá tr thay đ i r t th ự ng xuyên. ả ề ổ ị ố ẫ ổ ấ ệ ố ế ế ườ
ế ị ủ ố ẫ
l n th nh t s tr v t ng s m u tin ở ầ ấ ẽ ả ề ổ ở ệ ố ị ủ b t đ u b ng ch "TV" trong ậ ư ắ ầ ẽ ả ề ổ ố ẫ ữ ằ Giá tr c a bi n h th ng @ROWCOUNT ứ ệ ố hi n đang có trong b ng NHACC, và giá tr c a bi n h th ng @@ROWCOUNT ế ả ệ l n th hai s tr v t ng s m u tin có các mã v t t ứ ầ b ng VATTU. ả
Ví d :ụ
ủ ả ẩ ế ạ ả ề ủ ệ ề ả ủ ế ệ ố ấ ị ủ ạ ổ ổ Bi n @@VERSION tr v phiên b n, ngày c a s n ph m Microsoft SQL Server và lo i CPU, h đi u hành c a máy ch cài đ t Microsoft SQL Server. Bi n h th ng này ặ có giá tr r t ít thay đ i, giá tr c a nó ch thay đ i khi nào b n nâng c p h th ng ệ ố ỉ ị ấ Microsoft SQL Server.
ng dùng :
2/- M t s bi n h th ng th ộ ố ế ệ ố
ườ
ng dùng trong Microsoft SQL Server : Ý nghĩa c a m t s bi n h th ng th ộ ố ế ệ ố ủ ườ
- 9 -