Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Câu lệnh SQL Server RAISERROR với các ví dụ đơn giản

Câu lệnh SQL RAISERROR được sử dụng để gửi một thông báo tùy chỉnh đến ứng dụng khách. Nó cũng có thể được sử dụng để gỡ lỗi ứng dụng và áp dụng cho cơ chế xử lý lỗi.

Cú pháp và tham số câu lệnh SQL RAISERROR

Cú pháp của câu lệnh SQL RAISERROR như sau:

RAISERROR ( { message_text | message_id | @local_variable }  
    { ,severity ,state }  
    [ ,argument [ ,...n ] ]   
    [ WITH option [ ,...n ] ];

Dưới đây, bạn có thể xem giải thích về các tham số từ khóa RAISERROR mà bạn có thể chỉ định:

message_text - thông báo bạn muốn hiển thị để biết lỗi. Lưu ý: Chúng tôi có thể thêm các thông báo tùy chỉnh để hiển thị thông tin lỗi. Hãy xem nó được giải thích trong phần thứ hai của bài viết.

message_id - id của thông báo lỗi. Nếu bạn muốn hiển thị thông báo do người dùng xác định, bạn phải xác định nó. Xem danh sách message_ids trong sys.messages DMV .

Truy vấn

select * from sys.messages

Đầu ra:

mức độ nghiêm trọng - mức độ nghiêm trọng của một lỗi. Loại dữ liệu của mức độ nghiêm trọng biến smallint và các giá trị nằm trong khoảng từ 0 đến 25. Các giá trị hợp lệ của mức độ nghiêm trọng của lỗi như sau:

  • 0-10 - tin nhắn cung cấp thông tin
  • 11-18 - lỗi
  • 19-25 - lỗi nghiêm trọng

Lưu ý : Nếu bạn tạo một thông báo do người dùng xác định, mức độ nghiêm trọng được chỉ định trong thông báo do người dùng xác định sẽ bị ghi đè bởi mức độ nghiêm trọng được chỉ định trong câu lệnh RAISERROR.

trạng thái - số nhận dạng duy nhất mà bạn có thể sử dụng để xác định phần mã đang gây ra lỗi. Loại dữ liệu của thông số trạng thái smallint và các giá trị nằm trong khoảng từ 0 đến 255.

Bây giờ, chúng ta hãy chuyển sang các ví dụ thực tế.

Ví dụ 1:Sử dụng câu lệnh SQL Server RAISERROR để in kết quả

Trong ví dụ này, bạn có thể thấy cách chúng tôi có thể hiển thị thông báo lỗi hoặc thông tin bằng cách sử dụng câu lệnh RAISERROR.

Giả sử bạn muốn hiển thị thông báo sau khi chèn các bản ghi vào bảng. Chúng ta có thể sử dụng câu lệnh SQL PRINT hoặc RAISERROR. Sau đây là mã:

SET nocount ON 

INSERT INTO tblpatients 
            (patient_id, 
             patient_name, 
             address, 
             city) 
VALUES     ('OPD00006', 
            'Nimesh Upadhyay', 
            'AB-14, Ratnedeep Flats', 
            'Mehsana') 

RAISERROR ( 'Patient detail added successfully',1,1) 

Đầu ra:

Như bạn có thể thấy trong hình trên, ID thông báo là 50000 vì nó là thông báo do người dùng xác định.

Ví dụ 2:Câu lệnh SQL RAISERROR với văn bản thông báo động

Bây giờ, hãy xem cách chúng ta có thể tạo văn bản thông báo động cho câu lệnh SQL RAISERROR.

Giả sử chúng ta muốn in ID của bệnh nhân trong tin nhắn. Tôi đã xác định biến cục bộ có tên là @PworthyID , chứa bệnh nhân_id . Để hiển thị giá trị của @pworthyID trong văn bản tin nhắn, chúng ta có thể sử dụng mã sau:

DECLARE @PatientID VARCHAR(15) 
DECLARE @message NVARCHAR(max) 

SET @PatientID='OPD00007' 
SET @message ='Patient detail added successfully. The OPDID is %s' 

INSERT INTO tblpatients 
            (patient_id, 
             patient_name, 
             address, 
             city) 
VALUES     ('' + @PatientID + '', 
            'Nimesh Upadhyay', 
            'AB-14, Ratnedeep Flats', 
            'Mehsana') 

RAISERROR ( @message,1,1,@patientID) 

Đầu ra:

Để hiển thị chuỗi trong câu lệnh RAISERROR, chúng ta phải sử dụng câu lệnh in kiểu C.

Như bạn có thể thấy trong hình ảnh trên, to hiển thị tham số trong văn bản tin nhắn, tôi đã sử dụng tùy chọn % s hiển thị giá trị chuỗi của tham số . Nếu bạn muốn hiển thị tham số số nguyên , bạn có thể sử dụng tùy chọn % d .

Sử dụng SQL RAISERROR trong khối TRY..CATCH

Trong ví dụ này, chúng tôi đang thêm SQL RAISERROR trong khối TRY. Khi chúng tôi chạy mã này, nó thực thi tới khối CATCH được liên kết. Trong khối CATCH, chúng tôi sẽ hiển thị chi tiết về lỗi được gọi.

BEGIN try 
    RAISERROR ('Error invoked in the TRY code block.',16,1 ); 
END try 

BEGIN catch 
    DECLARE @ErrorMsg NVARCHAR(4000); 
    DECLARE @ErrSeverity INT; 
    DECLARE @ErrState INT; 

    SELECT @ErrorMsg = Error_message(), 
           @ErrSeverity = Error_severity(), 
           @ErrState = Error_state(); 

    RAISERROR (@ErrorMsg,
               @ErrSeverity,
               @ErrState 
    ); 
END catch;

Do đó, chúng tôi đã thêm câu lệnh RAISERROR với mức độ nghiêm trọng giữa 11-19. Nó gây ra việc thực thi khối CATCH.

Trong khối CATCH, chúng tôi đang hiển thị thông tin về lỗi ban đầu bằng cách sử dụng câu lệnh RAISERROR.

Đầu ra:

Như bạn có thể thấy, mã đã trả lại thông tin về lỗi ban đầu.

Bây giờ, hãy để chúng tôi hiểu cách chúng tôi có thể thêm thông báo tùy chỉnh bằng cách sử dụng sp_addmessage thủ tục được lưu trữ.

sp_addmessage Thủ tục lưu trữ

Chúng tôi có thể thêm thông báo tùy chỉnh bằng cách thực thi sp_addmessages thủ tục được lưu trữ. Cú pháp là:

EXEC Sp_addmessage 
  @msgnum= 70001, 
  @severity=16, 
  @msgtext='Please enter the numeric value', 
  @lang=NULL, 
  @with_log='TRUE', 
  @replace='Replace'; 

@msgnum: Chỉ định số tin nhắn. Kiểu dữ liệu của tham số là số nguyên. Đây là ID thông báo cho thông báo do người dùng xác định.

@severity: Chỉ định mức độ nghiêm trọng của lỗi. Các giá trị hợp lệ nằm trong khoảng từ 1 đến 25. Kiểu dữ liệu của tham số là smallint.

@messagetext: Chỉ định thông báo mà bạn muốn hiển thị. Kiểu dữ liệu của tham số là nvarchar (255), và giá trị mặc định là NULL.

@lang: Chỉ định ngôn ngữ mà bạn muốn sử dụng để hiển thị thông báo lỗi. Giá trị mặc định là NULL.

@with_log: Tham số này được sử dụng để viết thông báo cho trình xem sự kiện. Các giá trị hợp lệ là TRUE và FALSE. Nếu bạn chỉ định TRUE, thông báo lỗi sẽ được ghi vào trình xem sự kiện windows. Nếu bạn chọn FALSE, lỗi sẽ không được ghi vào nhật ký lỗi windows.

@replace: Nếu bạn muốn thay thế thông báo lỗi hiện có bằng thông báo do người dùng xác định và mức độ nghiêm trọng, bạn có thể chỉ định thay thế trong quy trình được lưu trữ.

Giả sử bạn muốn tạo thông báo lỗi trả về chất lượng không hợp lệ lỗi. Trong câu lệnh INSERT, giá trị của product_quantity nằm trong khoảng từ 20 đến 100. Thông báo phải được coi là lỗi và mức độ nghiêm trọng là 16.

Để tạo thông báo, hãy chạy truy vấn sau:

USE master;
go 
EXEC Sp_addmessage 
  70001, 
  16, 
  N'Product Quantity must be between 20 and 100.'; 
go

Sau khi tin nhắn đã được thêm vào, hãy chạy truy vấn bên dưới để xem nó:

USE master 
go 
SELECT * FROM   sys.messages WHERE  message_id = 70001 

Đầu ra:

Cách sử dụng thông báo lỗi do người dùng xác định

Như tôi đã đề cập trước đó, chúng ta phải sử dụng message_id trong câu lệnh RAISERROR cho các thông báo do người dùng xác định.

Chúng tôi đã tạo một thông báo với ID là 70001. Câu lệnh RAISERROR sẽ như sau:

USE master 
go 
RAISERROR (70001,16,1 ); 
go 

Đầu ra:

Câu lệnh RAISERROR đã trả lại thông báo do người dùng xác định.

quy trình lưu trữ sp_dropmessage

sp_dropmessage thủ tục được lưu trữ được sử dụng để xóa các tin nhắn do người dùng xác định. Cú pháp như sau:

EXEC Sp_dropmessage @msgnum

Trong cú pháp, @msgnum chỉ định ID của thư bạn muốn xóa.

Bây giờ, chúng tôi muốn xóa thư có ID là 70001 . Truy vấn như sau:

EXEC Sp_dropmessage 70001 

Khi tin nhắn đã bị xóa, hãy chạy truy vấn sau để xem nó:

USE master 
go 
SELECT * FROM   sys.messages WHERE  message_id = 70001 

Đầu ra:

Như bạn có thể thấy, tin nhắn đã bị xóa.

Tóm tắt

Như vậy, chúng ta đã khám phá câu lệnh RAISERROR, các tham số của nó và chứng minh cách sử dụng của nó trong các ví dụ thực tế. Chúng tôi cũng đã làm rõ việc sử dụng sp_addmessage sp_dropmessage các thủ tục được lưu trữ. Hy vọng rằng bài viết này đã mang lại cho bạn một số hiểu biết hữu ích cho mục tiêu làm việc của bạn.

Chúng tôi luôn vui mừng khi nghe nhận xét của bạn và có thể là các mẹo thực tế bổ sung nếu bạn muốn chia sẻ chúng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi chênh lệch múi giờ trên giá trị datetimeoffset trong SQL Server (T-SQL)

  2. Thiết kế cơ sở dữ liệu:một bảng lớn hay các bảng riêng biệt?

  3. Tôi có thể sử dụng một luồng để CHÈN hoặc CẬP NHẬT một hàng trong SQL Server (C #) không?

  4. Sự khác biệt giữa số, số thực và số thập phân trong SQL Server

  5. Cách thực hiện một truy vấn chuyển qua CHÈN trong SQL Server