Để tăng hiệu năng của stored procedures, Bạn nên chứa mã trả về trạng thái thành công hay thất bại của thủ tục. Nếu thất bại thì thông báo về lỗi đã xảy ra.
Để kiểm tra lỗi bạn sử dụng hàm @@Error. Để trả về thông tin về lỗi bạn có thể sử dụng lệnh Return hoặc lệnh Raiserror.
1- Hàm @@ERROR
Hàm @@ERROR chứa mã lỗi cho phát biểu vừa thực hiện. Nó tự động xóa và đặt lại mã lỗi với mỗi phát biểu được thực hiện. Giá trị 0 nếu phát biểu thành công.
Bạn có thể dùng hàm @@ERROR để xác định mã lỗi hoặc làm điều kiện kết thúc thủ tục.
Ví dụ: Chèn Hoá đơn mới, nếu ngày lập là chủ nhật thì chuyển thành ngày thứ 2 CREATE PROC spThemHD ( @MaHD SmallInt, @NgayLap SmallDateTime )
As
If (IsDate(@NgayLap) = 0) Return 0
If DatePart(w, @NgayLap) = 1 Set @NgayLap = @NgayLap + 1
Insert Into HoaDon(MaHD, NgayLap) Values(@MaHD, @NgayLap) If (@Error <> 0)
Begin
RaiseError(‘Loi them hoa don moi’,10,1) Return 0
End
2- Lệnh RAISERROR
Phát biểu RAISERROR dùng xuất thông báo lỗi lấy từ table sysmessages hoặc một thông báo với nội dung nào đó
RAISERROR ( { msg_id | msg_str } { ,severity ,state } [ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
Arguments
o msg_id: Mã số > 50000 của dòng thông báo do người dùng tạo trên table sysmessages
bằng thủ tục sp_AddMessage
o msg_str: Nội dung thông báo lỗi cần xuất. .
o severity: Mã số chỉ định mức độ nghiên trọng của lỗi.
Mức độ từ 0-19 được xem như là thông tin phản hồi. Mức từ 0 đến 16: lỗi phát sinh do dữ liệu. Mức 10 là lbáo cáo trạng thái. Mức từ 11 - 16 là những lỗi có thể được hiệu chỉnh bởi user.
Mức từ 20 - 25 chỉ định các lỗi tác hại từ ứng dụng không thể phục hồi. Nếu thông báo mức này, kết nối từ Client đến Server sẽ bị ngắt.
o State: là số nguyên từ 1 đến 127 biểu diễn thông tin về trạng thái thỉnh cầu của lỗi., nhằm chỉ rõ lỗi thuộc nhóm nào trong hệ thống lỗi. Giá trị phủ nhận của state là 1.
o Argument: Là tham số dùng thay thế vào những biến được sử dụng trong chuỗi msg_str
hoặc thông báo tương ứng với msg_id. Mỗi tham số thay thế có thể là 1 biến cục bộ hoặc giá trị thuộc kiểu: int1, int2, int4, char, varchar, binary, or varbinary.
RAISERROR ('The level for job_id:%d should be between %d and %d.', 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
o Option: có thể chứa các giá trị sau:
Value Description
LOG Ghi lỗi vào file nhật ký.
NOWAIT Gởi thông báo ngay lập tức đến client.
SETERROR Đặt giá trị msg_id hay 50000 cho hàm @@ERROR. Ví dụ: RAISERROR('Invalid member number', 10, 1) WITH LOG
Khi xuất hiện lỗi, mã lỗi được đặt trong hàm @@ERROR. Mặc định @@ERROR được đặt bằng 0 cho các lỗi có severity từ 1 đến 10.
3- Thêm Thông báo lỗi vào bảng sysmessages:
-a Dùng thủ tục sp_addmessage để thêm vào bảng sysmessages. .
sp_AddMessage @msgnum = msg_id ,
@severity = severity , @msgtext = 'msg'
[ , @lang = 'language' ]
[ , @with_log = 'True | False' ] [ , @replace = 'REPLACE' ]
msg_id: phải có giá trị từ 50.001 trở lên.
’REPLACE’: dùng chỉ định lệnh sẽ thay thế msg_id nếu msg_id đã có trong bảng.
Example: USE master
EXEC sp_addmessage @msgnum = 60000, @severity = 16,
@msgtext = ‘Kiểu dữ liệu không hợp lệ’ , @lang = 'us_english', @with_log = 'true'
-b Để xóa thống báo lỗi : sử dụng sp_dropmessage
sp_DropMessage@msgnum = msg_id
Chú thích – Comments
Có 2 cách chú thích: chú thích trên cùng dòng lệnh hoặc chú thích trên nhiều dòng.
Chú thích trên cùng dòng với một phát biểu - In-Line Comments
Sử dụng 2 dấu trừ (--) trước lời chú thích.
Chú thích trên nhiều dòng – Block Comments
Chương VI: Chuyển Tác Và Bẫy Lỗi
I- Các Phát Biểu Chuyển Tác – Transactions:-1 Khái niệm :