22

tôi vừa tạo là gì Thay vào đó Sau khi kích hoạt có cú pháp được đưa ra dưới đây:ý nghĩa cú pháp của RAISERROR()

Create trigger tgrInsteadTrigger on copytableto 
Instead of Insert as 
    Declare @store_name varchar(30); 
    declare @sales int; 
    declare @date datetime; 

    select @store_name = i.store_name from inserted i 
    select @sales = i.sales from inserted i 
    select @date = i.Date from inserted i 
begin 
    if (@sales > 1000) 
     begin 
     RAISERROR('Cannot Insert where salary > 1000',16,1); ROLLBACK; 
     end 
    else 
     begin 
     insert into copytablefrom(store_name, sales, date) values (@store_name, @sales, @date); 
     Print 'Instead After Trigger Executed'; 
     end 
End 

Trong cú pháp trên, chúng tôi đã sử dụng RAISERROR('Cannot Insert where salary > 1000',16,1)

Nhưng khi tôi viết RAISERROR('Cannot Insert where salary > 1000') nó đưa ra lỗi "Cú pháp không chính xác gần ')'" trên cùng một dòng.

Bất kỳ ai cũng có thể giải thích việc sử dụng (16,1) tại đây.

+0

Cú pháp của 'RaIsError' được giải thích [ở đây] (http://msdn.microsoft.com/en-us/library/ms178592 (v = sql.100) .aspx). – HABO

+3

Trình kích hoạt này bị hỏng - giả định rằng có một hàng * đơn * trong 'chèn', trong khi trên thực tế có thể có 0, 1 hoặc * nhiều * hàng trong' chèn'. –

Trả lời

37

Đây là mức độ nghiêm trọng của lỗi. Các mức này là từ 11 - 20, điều này gây ra lỗi trong SQL. Cấp độ càng cao, mức độ và giao dịch càng nghiêm trọng càng bị hủy bỏ.

Bạn sẽ nhận được lỗi cú pháp khi bạn làm:

RAISERROR('Cannot Insert where salary > 1000'). 

Bởi vì bạn đã không quy định các thông số chính xác (mức độ nghiêm trọng hoặc tiểu bang).

Nếu bạn muốn phát hành một cảnh báo và không phải là một ngoại lệ, mức độ sử dụng 0 - 10

Từ MSDN:

mức độ nghiêm trọng

là mức độ nghiêm trọng do người dùng định nghĩa gắn liền với điều này thông điệp. Khi sử dụng msg_id để tăng thư do người dùng xác định được tạo bằng cách sử dụng sp_addmessage, mức độ nghiêm trọng được chỉ định trên RAISERROR ghi đè mức độ nghiêm trọng được chỉ định trong sp_addmessage . Mức độ nghiêm trọng từ 0 đến 18 có thể được chỉ định bởi bất kỳ người dùng nào. Mức độ nghiêm trọng từ 19 đến 25 có thể chỉ được chỉ định bởi các thành viên của vai trò máy chủ cố định sysadmin hoặc người dùng có quyền ALTER TRACE. Đối với mức độ nghiêm trọng từ 19 đến 25, tùy chọn WITH LOG là bắt buộc.

bang

là một số nguyên từ 0 đến 255. Giá trị âm hoặc giá trị lớn hơn 255 tạo ra một lỗi. Nếu cùng một lỗi do người dùng xác định là được tăng lên ở nhiều vị trí, sử dụng số trạng thái duy nhất cho mỗi vị trí có thể giúp tìm phần mã nào đang tăng lỗi.

http://support.microsoft.com/kb/321903

+0

Cảm ơn, câu trả lời của bạn đã xóa khái niệm của tôi, nhưng bạn có thể giải thích khái niệm đằng sau trạng thái cũng không, tham số thứ ba của RAISERROR(). – user2289490

+2

@ user2289490 - nó chỉ đơn giản có thể được sử dụng để xác định nơi lỗi được ném. I E. nếu bạn nêu ra lỗi với trạng thái 1 và sau đó một lỗi khác (trong một phần khác của thủ tục đã lưu trữ của bạn), bạn có thể theo dõi phần nào của thủ tục của bạn đã ném ngoại lệ. –

8

theo MSDN

RAISERROR ({ msg_id | msg_str | @local_variable } 
    { ,severity ,state } 
    [ ,argument [ ,...n ] ]) 
    [ WITH option [ ,...n ] ] 

16 sẽ là mức độ nghiêm trọng.
1 sẽ là trạng thái.

Lỗi bạn nhận được là do bạn chưa cung cấp đúng các thông số bắt buộc cho hàm RAISEERROR.

11

16 là mức độ nghiêm trọng và 1 là nhà nước, ví dụ cụ thể hơn sau đây có thể cung cấp cho bạn chi tiết hơn về cú pháp và cách dùng:

BEGIN TRY 
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block. 
    RAISERROR ('Error raised in TRY block.', -- Message text. 
       16, -- Severity. 
       1 -- State. 
       ); 
END TRY 
BEGIN CATCH 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

    SELECT 
     @ErrorMessage = ERROR_MESSAGE(), 
     @ErrorSeverity = ERROR_SEVERITY(), 
     @ErrorState = ERROR_STATE(); 

    -- Use RAISERROR inside the CATCH block to return error 
    -- information about the original error that caused 
    -- execution to jump to the CATCH block. 
    RAISERROR (@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
       ); 
END CATCH; 

Bạn có thể làm theo và cố gắng hiểu thêm ví dụ từ http://msdn.microsoft.com/en-us/library/ms178592.aspx

3

Mức độ nghiêm trọng 16 trong mã ví dụ của bạn thường được sử dụng cho các lỗi do người dùng xác định (do người dùng phát hiện). Bản thân DBMS của SQL Server phát ra severity levels (và thông báo lỗi) cho các vấn đề mà nó phát hiện, cả hai đều nghiêm trọng hơn (số cao hơn) và ít hơn (số thấp hơn).

Trạng thái phải là số nguyên từ 0 đến 255 (giá trị âm sẽ cho lỗi), nhưng lựa chọn về cơ bản là của người lập trình. Sẽ hữu ích khi đặt các giá trị trạng thái khác nhau nếu thông báo lỗi tương tự cho lỗi do người dùng xác định sẽ được tăng lên ở các vị trí khác nhau, ví dụ: nếu việc gỡ rối/khắc phục sự cố các vấn đề sẽ được hỗ trợ bằng cách có thêm dấu hiệu cho thấy lỗi xảy ra.