2013-05-21 41 views
17

SQL Server 2008 R2 Management Studio không nhận ném của tôi trong ví dụ dưới đây, nó nóiTôi không thể sử dụng ném SQL Server 2008 R2

cú pháp không chính xác gần Ném

tôi đang cố gắng để ném một lỗi ở đây, vì vậy tôi có thể xử lý nó trong trang web của tôi khi ai đó chèn cùng một giá trị hai lần.

Begin Try 
insert into BusinessID (BusinessID) values (@ID) 
insert into BusinessID (BusinessID) values (@ID) 

End Try 

Begin Catch 

Print 'PK already exist' 
THROW 
End Catch 
+0

'THROW' là ** tính năng mới ** trong SQL Server ** 2012 ** và do đó nó chưa có sẵn trong năm 2008 R2 ..... –

+0

Rất tiếc, có vẻ như bạn cần phải chấm dứt câu lệnh đặt trước THROW với dấu chấm phẩy; nếu không bạn sẽ gặp lỗi cú pháp! – joedotnot

Trả lời

36

THROW Tuyên bố được giới thiệu trong SQL Server 2012

http://msdn.microsoft.com/en-us/library/ee677615.aspx

Bạn có thể sử dụng RAISERROR để thay thế.

http://msdn.microsoft.com/en-us/library/483588bd-021b-4eae-b4ee-216268003e79(v=sql.105)

BEGIN CATCH 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

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

    RAISERROR (@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
       ); 
END CATCH; 
+0

Cảm ơn bạn rất nhiều, tất cả những gì tôi cần là thông tin nhỏ mà Throw được giới thiệu trong SQL server 2012, và cảm ơn bạn đã làm rõ tuyên bố RAISERROR – user2405574

+0

Một sự khác biệt nhỏ. RAISERROR không dừng thực thi, còn THROW thì không. –

+1

@ MehmetAVŞAR Điều đó không chính xác. Việc thực hiện không dừng lại dựa trên bất cứ điều gì đó là RAISERROR hoặc THROW, nó dừng lại dựa trên mức độ nghiêm trọng. Với RAISERROR, bạn có thể tự thiết lập mức độ nghiêm trọng và chọn bất cứ điều gì sẽ được thực hiện. Với THROW, bạn không thể và mặc định là 16 không dừng thực thi, tuy nhiên khi được sử dụng từ khối CATCH, nó chỉ chuyển tiếp ngoại lệ đã biết cuối cùng, có thể hoặc không thể là 16. –

3

Sử dụng RAISERROR thay vì Ném trong khối sql của bạn.

Begin Try 
insert into BusinessID (BusinessID) values (@ID) 
insert into BusinessID (BusinessID) values (@ID) 

End Try 

Begin Catch 

Print 'PK already exist' 
    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 
+0

Cảm ơn bạn đã đề xuất của bạn, và để áp dụng đề xuất của bạn trên ví dụ chính xác của tôi :) – user2405574

+0

Điều gì sẽ xảy ra nếu 'ERROR_MESSAGE() LIKE '% [%] s%'' hay gì đó? – binki

Các vấn đề liên quan