2013-08-05 47 views
11

Tôi đang thêm một số xác nhận vào một vài thủ tục được lưu trữ và cần kiểm tra xem một số biến không phải là rỗng (chúng được điền trước đó trong thủ tục đã lưu).SQL chỉ một cú ném bên trong nếu câu

Tôi đã cố gắng để thêm một "ném" bên trong một câu lệnh if như dưới đây:

IF (@val is null) 
BEGIN 
    THROW 50001, 'Custom text', 1 
END 

Điều này gây ra một lỗi cú pháp trên "ném" như nó đang tìm kiếm các mã khác bên trong câu lệnh if trước để ném nhưng tôi chỉ cần nó để thực hiện ném bên trong tuyên bố nếu.

Tôi cần giữ cho quy trình được lưu trữ càng nhẹ càng tốt để giữ càng nhanh càng tốt để thực hiện.

Có ai có ý tưởng nào không?

+1

Hệ thống cơ sở dữ liệu nào? SQL chỉ là viết tắt của ngôn ngữ chuẩn. Vui lòng thêm thẻ cho hệ thống cơ sở dữ liệu cụ thể của bạn. –

+0

Cảm ơn bạn Tôi đã thêm thẻ bổ sung để tham khảo trong tương lai. –

+1

[THROW là một tính năng của SQL Server 2012] (http://stackoverflow.com/questions/16670985/i-am-unable-to-use-throw-sql-server-2008-r2) –

Trả lời

1
DECLARE @val NVARCHAR(50) = NULL 
IF @val is null 

    RAISERROR('Custom text', 16,16) 

cho mức độ khác nhau séc

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

+0

Hình như phần mềm readyroll không thích ném và đưa ra một lỗi khi biên dịch nhưng sử dụng RAISERROR hoạt động chính xác. –

+0

http://msdn.microsoft.com/vi -us/library/ms164086.aspx cho các cấp độ khác nhau –

+3

RAISERROR sẽ không còn được sử dụng trong mã mới, vì nó sẽ bị ngừng trong tương lai – NReilingh

0

Nếu điều này là dành cho SQL Server, trình đánh dấu cú pháp intellisense không thích nó, nhưng mã nên biên dịch và chạy tốt. Tất nhiên, với nó là một tuyên bố duy nhất, bạn không cần BEGIN ... END khối tại tất cả:

IF (@val is null) THROW 50001, 'Custom text', 1 
+1

Tôi vẫn nhận được "cú pháp không đúng gần như ném "khi xây dựng với readyroll (nó biên dịch và hoạt động chính xác trong ssms. –

22

Các lỗi cú pháp được hiển thị vì câu lệnh trước đó chưa bị chấm dứt. Các câu trả lời khác sẽ hoạt động, nhưng để làm điều đó theo cách này bạn có thể ném một dấu chấm phẩy ngay trước THROW, hoặc có thói quen chấm dứt tất cả các câu lệnh với dấu chấm phẩy.

IF (@val is null) 
BEGIN 
    ;THROW 50001, 'Custom text', 1 
END 

hoặc

IF (@val is null) 
BEGIN; 
    THROW 50001, 'Custom text', 1; 
END; 

Bạn có thể đã nhận thấy rằng:

IF (@val is null) 
    THROW 50001, 'Custom text', 1 

... cũng sẽ làm việc, và điều này là bởi vì SQL Server biết rằng điều tiếp theo để đến sau khi một Câu lệnh IF luôn là một câu lệnh T-SQL mới. Có lẽ đáng chú ý là Microsoft đã tuyên bố rằng ngôn ngữ T-SQL trong tương lai sẽ yêu cầu dấu chấm phẩy sau mỗi câu lệnh, vì vậy khuyến nghị của tôi là bắt đầu xây dựng thói quen ngay bây giờ.

+2

Đây phải là câu trả lời: – Davos

+0

Cú pháp đó chắc chắn có vẻ lạ, các câu lệnh BEGIN ở đây END; Tại sao OK để chấm dứt BEGIN!? – joedotnot

+0

@joedotnot Đổ lỗi cho Microsoft có thể?:-) Có lẽ khi ném là tuyên bố duy nhất, bỏ qua BEGIN/END là thích hợp hơn, và khi một số tuyên bố khác được sử dụng trước khi ném, dấu chấm phẩy sau khi BEGIN là không cần thiết. – NReilingh