PRINT 'The following products have a UnitPrice of less than $5:'
SELECT ProductID, ProductName, UnitPrice
FROM Products
WHERE UnitPrice < 5
END
ELSE
BEGIN
PRINT 'There are no products that have a UnitPrice of less than $5'
END
S dng nhng phát biu CASE
Bn s dng phát biu CASE để so sánh mt giá tr vi mt danh sách nhng giá tr và thc hin mt hoc
nhiu phát biu khi mt giá tr phù hp được tìm thy. Chng hn, phát biu CASE sau đây tr li
Massachusetts
CASE 'MA'
WHEN 'CA' THEN 'California'
WHEN 'MA' THEN 'Massachusetts'
WHEN 'NY' THEN 'New York'
END
Ví d kế tiếp s dng mt phát biu SELECT để truy xut giá tr Massachusetts được tr li bi phát biu
CASE:
DECLARE @State nchar(2)
SET @State = 'MA'
DECLARE @StateName nvarchar(15)
SELECT CASE @State
WHEN 'CA' THEN 'California'
WHEN 'MA' THEN 'Massachusetts'
WHEN 'NY' THEN 'New York'
END
Bn có th ct gi giá tr được truy xut bi phát biu SELECT trong mt biến, như trong ví d kế tiếp
DECLARE @State nchar(2)
SET @State = 'MA'
DECLARE @StateName nvarchar(15)
SELECT @StateName =
CASE @State
WHEN 'CA' THEN 'California'
WHEN 'MA' THEN 'Massachusetts'
WHEN 'NY' THEN 'New York'
END
PRINT @StateName
Đầu ra t ví d này như sau:
Massachusetts
Bn cũng có th so sánh mt giá tr ct trong mt phát biu CASE. Chng hn:
SELECT Price =
CASE
WHEN UnitPrice IS NULL THEN 'Unknown'
WHEN UnitPrice < 10 THEN 'Less than $10'
WHEN UnitPrice = 10 THEN '$10'
ELSE 'Greater than $10'
END
FROM Products
Bn chú ý: t ví d này bn cũng có th cung cp mt điu kin ELSE catchall trong mt phát biu CASE.
S dng nhng vòng lp "WHILE"
Bn s dng mt vòng lp "WHILE" để chy mt hoc nhiu phát biu nhiu ln. Mt vòng lp "WHILE" chy
cho đến khi mt điu kin ch định chuyn giá tr thành false. Cú pháp cho mt vòng lp WHILE như sau:
WHILE condition
statement
Ví d sau đây cho thy mt vòng lp "WHILE"
DECLARE @count int
SET @count = 5
WHILE (@count > 0)
BEGIN
PRINT 'count = ' + CONVERT(nvarchar, @count)
SET @count = @count -1
END
Vòng lp này được chy cho đến khi biến đếm count tr thành 0, và đầu ra t mã này như sau:
count = 5
count = 4
count = 3
count = 2
count = 1
Hàm CONVERT() (chuyn đổi) được dùng để chuyn đổi mt giá tr t kiu này sang kiu khác. Chng hn,
CONVERT ( nvarchar, @count) chuyn đổi biến đếm count ti kiu nvarchar, ri nó có th được s dng vi
lnh PRINT (in).
Phát biu CONTINUE (tiếp tc)
Bn s dng phát biu CONTINUE để nhy ti ln lp tiếp theo ca mt vòng lp "WHILE" b qua qua bt k
mã còn li nào trong ln lp hin thi. phát biu CONTINUE gây ra s thc hin nhy tr li đim khi đầu
ca ln lp kế tiếp.
Ví d sau đây cho thy mt vòng lp "WHILE" s s dng phát biu CONTINUE để bt đầu ln lp tiếp theo
ca vòng lp nếu biến đếm count bng 2:
DECLARE @count int
SET @count = 5
WHILE (@count > 0)
BEGIN
PRINT 'count = ' + CONVERT(nvarchar, @count)
SET @count = @count -1
IF (@count = 2)
BEGIN
SET @count = @count -1
CONTINUE
END
END
Đầu ra t mã này như sau:
count = 5
count = 4
count = 3
count = 1
Bn chú ý kết qu không hin th biến đếm count = 2 . Đây là vì phát biu CONTINUE thc thi s nhy qua ln
lp này.
Phát biu BREAK
Bn s dng phát biu BREAK để kết thúc mt vòng lp "WHILE" ngay lp tc. Phát biu BREAK gây ra s
thc hin nhy khi vòng lp và tiếp tc thc hin bt k phát biu nào sau vòng lp này.
Ví d sau đây cho thy mt vòng lp "WHILE" s dng phát biu BREAK để kết thúc vòng lp khi biến đếm
count bng 2
DECLARE @count int
SET @count = 5
WHILE (@count > 0)
BEGIN
PRINT 'count = ' + CONVERT(nvarchar, @count)
SET @count = @count -1
IF (@count = 2)
BEGIN
BREAK
END
END
Đầu ra t mã này như sau:
count = 5
count = 4
count = 3
S dng nhng nhãn và Phát biu GOTO
Bn s dng phát biu GOTO để nhy ti mt nhãn được ch định trong mã ca bn; bn s dng mt nhãn để
xác định mt phát biu trong mã ca bn. Bn phi định nghĩa nhãn trước khi phát hành GOTO ti nhãn này.
Trước khi tôi trình bày nhng chi tiết ca phát biu GOTO, bn cn phi ý thc được s s dng nó được coi là
mt thc hành lp trình nghèo nàn, và bn cn phi tránh s dng nó nếu có th được.Thông thường luôn có
cu trúc mã để bn không cn s dng phát biu GOTO. Như đã nói, tôi bao gm nó trong chương này ch
tính cht b sung.
Như đã được đề cp, phát biu GOTO yêu cu bn to ra mt nhãn trong chương trình ca bn. Bn làm điu
này bng cách đặt mt định danh cha tên nhãn trong mã ca bn, theo sau là mt du hai chm (:) . Ví d sau
đây to ra mt nhãn có tên myLabel:
myLabel:
Ri bn có th s dng phát biu GOTO để nhy ti nhãn này, chng hn:
GOTO myLabel
Ví d sau đây cho thy s s dng mt nhãn và phát biu GOTO:
DECLARE @count int
SET @count = 5
myLabel:
PRINT 'count = ' + CONVERT(nvarchar, @count)
SET @count = @count -1
IF (@count > 0)
BEGIN
GOTO myLabel
END
Đầu ra t mã này như sau:
count = 5
count = 4
count = 3
count = 2
count = 1
S dng nhng phát biu RETURN
Bn s dng phát biu RETURN để thoát ra khi mt th tc lưu tr hay nhóm nhng phát biu. Bt k phát
biu nào sau RETURN ca bn đều không được thc hin. Bn có th cũng tr v mt giá tr s dng phát
biu RETURN .
Cú pháp cho phát biu RETURN như sau:
RETURN [int_expression]
Vi int_expression là bt k biu thc nào có kết qu là mt giá tr int.
Ghi chú:
Bn có th tr v mt giá tr ch khi s dng phát biu RETURN vi mt th tc lưu tr. Bn s thy
mt ví d v điu này sau trong mc "Gii thiu v nhng th tc lưu tr ".
Ví d sau đây cho thy s s dng phát biu RETURN:
DECLARE @count int
SET @count = 5
WHILE (@count > 0)
BEGIN
PRINT 'count = ' + CONVERT(nvarchar, @count)
SET @count = @count -1
IF (@count = 2)
BEGIN
RETURN
END
END
Đầu ra t mã này như sau:
count = 5
count = 4
count = 3
S dng nhng phát biu WAITFOR
Có nhng ln khi bn mun chương trình ca bn tm dng trước khi chy mã nào đó để thc hin mt tác v
c th, như chy mt đợt chương trình vào ban đêm để cp nht nhng bn ghi khách hàng. Bn s dng s
phát biu WAITFOR để ch rõ mt khong thi gian hay thi gian để đợi cho đến khi tiếp tc s thc hin ca
mã.
Cú pháp cho phát biu WAITFOR như sau:
WAITFOR {DELAY 'time interval' | TIME 'actual time'}
Bn có th ch rõ khong thi gian đợi s dng t khóa DELAY , hay bn có th ch rõ thi gian thc tế để đợi
cho đến s dng t khóa TIME. Bn có th ch rõ mt khong thi gian hay mt thi gian thc tế trong định
dng HH:MM:SS, vi HH là gi ( trong định dng 24), MM là phút, và SS là giây.
Đây là mt s ví d:
WAITFOR DELAY '00: 00: 05' đợi trong khong thi gian 5 giây.
WAITFOR DELAY '23: 10: 25' đợi trong khong thi gian 23 gi, 10 phút, và 25 giây.
WAITFOR TIME '20: 15: 10' đợi cho đến 10 giây sau 10: 15 PM.
Nhng ví d sau đây in ra mt thông báo sau 5 giây trôi qua
BEGIN
WAITFOR DELAY '00:00:05'
PRINT '5 seconds have elapsed'
END
S dng nhng phát biu RAISERROR
Bn s dng s phát biu RAISERROR để phát sinh mt thông báo li. Bn đin hình s mun làm điu này
nếu mt li xut hin trong mt trong s nhng th tc lưu tr ca bn, Bn s thy cách s dng sau đó trong
mc " To nhng th tc lưu tr ."
Cú pháp được đơn gin hóa cho phát biu RAISERROR như sau:
RAISERROR ({number | description}{, severity, state})
Vi number là s đặc trưng cho li, giá tr ca nó nm gia 50,001 và 2,147,483,648. description là mt thông
báo mà không được vượt quá 400 ký t. severity là mc độ ca li và phi nm trong khang t 0 đến 18 (18 là
li nng nht). state là mt giá tr bt k nm gia 1 và 127, và mô t thông tin v trng thái yêu cu ca li .
Nhng ví d sau đây cho thy s s dng phát biu RAISERROR:
RAISERROR (50001, 15, 1)
RAISERROR ('No row with that ProductID was found', 10, 1)
S dng nhng con tr
Khi bn thc hin mt phát biu SELECT, tt c nhng hàng được tr v trong mt ln truy cp. Điu này có l
không luôn luôn thích hp. Chng hn, bn có th đã mun s lý hot động nào đó da vào nhng giá tr ct
được truy xut cho mt hàng c th. Để làm điu này, bn có th s dng mt con tr (cursor) để x lý nhng
hàng được truy xut t cơ s d liu mi hàng mt ln. Mt con tr cho phép bn bước qua nhng hàng được
tr v bi mt phát biu SELECT c th.
Bn theo nhng bước này khi s dng mt con tr:
1. Khai báo nhng biến để ct gi nhng giá tr ct t phát biu SELECT.
2. Khai báo con tr (cursor), ch rõ phát biu SELECT ca bn.
3. M con tr (cursor) các bn.
4. Np nhng hàng t con tr ca bn v.
5. Đóng con tr ca bn.
Bn s hc nhng chi tiết ca nhng bước này trong nhng mc sau đây.