Tôi có một quy trình được lưu trữ thực hiện một số xác thực tham số và sẽ không thành công và ngừng thực thi nếu tham số không hợp lệ.Cách "đúng" để thực hiện xác thực thông số thủ tục lưu trữ
tiếp cận đầu tiên của tôi cho kiểm tra lỗi trông như thế này:
create proc spBaz
(
@fooInt int = 0,
@fooString varchar(10) = null,
@barInt int = 0,
@barString varchar(10) = null
)
as
begin
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
raiserror('invalid parameter: foo', 18, 0)
if (@barInt = 0 and (@barString is null or @barString = ''))
raiserror('invalid parameter: bar', 18, 0)
print 'validation succeeded'
-- do some work
end
này không làm các trick kể từ mức độ nghiêm trọng 18 không chỉ dừng lại việc thực hiện và 'xác nhận thành công' được in cùng với các thông báo lỗi.
Tôi biết tôi chỉ đơn giản là có thể thêm một trở lại sau mỗi RAISERROR nhưng điều này có vẻ loại xấu xí với tôi:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
Kể từ lỗi với mức độ nghiêm trọng 11 trở lên đang bắt trong một khối try/catch cách tiếp cận khác Tôi đã thử nghiệm là để đóng gói lỗi của tôi kiểm tra bên trong một khối try/catch như vậy. Vấn đề là lỗi đã bị nuốt và không được gửi cho khách hàng chút nào. Vì vậy, tôi đã làm một số nghiên cứu và tìm ra cách để rethrow lỗi:
tôi vẫn không hài lòng với phương pháp này vì vậy tôi hỏi bạn:
Làm thế nào để xác nhận thông số của bạn trông như thế nào? Có một số loại "thực hành tốt nhất" để làm loại kiểm tra?
Có lý do nào khiến bạn sử dụng IF (ISNULL (@fooString, '') = '') thay vì IF (@fooString là null) không? – macleojw
@macleojw: Anh ta kiểm tra null và '' cùng một lúc .. thông minh :) – VVS
Trình xác thực thứ hai có cú pháp không hợp lệ: 'RAISEERROR'. Chỉ nên có một 'e'. Hài hước là bằng tiếng Anh nó là chính xác như 'nâng cao + lỗi' đã tăng gấp đôi 'e' nhưng không phải trong ngôn ngữ MS SQL. –