2008-12-01 28 views

Trả lời

-7

Xác thực tham số hiện không phải là tính năng của logic thủ tục trong SQL Server và NOT NULL chỉ là một kiểu xác thực dữ liệu có thể có. CHAR datatype trong một bảng có một đặc tả độ dài. Điều đó có nên được thực hiện không? Và làm thế nào để bạn xử lý các ngoại lệ? Có một phương pháp mở rộng, được phát triển cao và phần nào dựa trên tiêu chuẩn để xử lý ngoại lệ trong các lược đồ bảng; nhưng không phải cho logic thủ tục, có lẽ vì logic thủ tục được định nghĩa từ các hệ thống quan hệ. Mặt khác, các thủ tục đã lưu trữ đã có một cơ chế hiện có để tăng các sự kiện lỗi, được gắn vào nhiều API và ngôn ngữ. Không có sự hỗ trợ như vậy đối với các ràng buộc kiểu dữ liệu khai báo trên các tham số. Hàm ý của việc thêm nó là mở rộng; đặc biệt là vì nó hỗ trợ tốt, và có thể mở rộng, chỉ cần thêm đoạn code:

IF ISNULL(@param) THEN 
    raise error .... 
END IF 

Khái niệm về NULL trong bối cảnh của một thủ tục lưu trữ được thậm chí không được xác định rõ đặc biệt là so với bối cảnh của một bảng hoặc một biểu thức SQL. Và nó không phải là định nghĩa của Microsoft. Các nhóm tiêu chuẩn SQL đã dành rất nhiều năm tạo ra rất nhiều tài liệu thiết lập hành vi của NULL và giới hạn của các định nghĩa cho hành vi đó. Và các thủ tục được lưu trữ không phải là một trong số chúng.

Quy trình được lưu trữ được thiết kế để có trọng lượng nhẹ nhất có thể để thực hiện hiệu suất cơ sở dữ liệu hiệu quả nhất có thể. Các kiểu dữ liệu của các tham số không có để xác nhận, nhưng để cho phép trình biên dịch cung cấp cho trình tối ưu hóa truy vấn thông tin tốt hơn để biên dịch kế hoạch truy vấn tốt nhất có thể. Một ràng buộc NOT NULL trên một tham số được hướng xuống một đường dẫn toàn bộ bằng cách làm cho trình biên dịch phức tạp hơn cho mục đích mới của việc xác nhận các đối số. Và do đó ít hiệu quả và nặng hơn.

Có một lý do khiến các thủ tục được lưu trữ không được viết dưới dạng hàm C#.

+43

* "tại sao nó nên có thể" * - Ummm ... bởi vì nó là một phím tắt rất thường được sử dụng trong câu lệnh 'CREATE TABLE', vì vậy * không * có nó cho' CREATE PROCEDURE' là không phù hợp? Làm thế nào cứng nó sẽ được cho SQL Server để kiểm tra các tham số cho null trong cùng một cách chính xác nó cho cột bảng? –

+0

'NOT NULL' _is_ một phần của kiểu dữ liệu.Hãy suy nghĩ về nó như 'nullable' so với 'non-nullable'. Một là một kiểu chứa tất cả các giá trị 'chuẩn', và cũng bao gồm một giá trị trường hợp NULL đặc biệt. Cái còn lại chỉ chứa các giá trị 'chuẩn'. Hai loại này dựa trên các giá trị cơ bản giống nhau, nhưng một loại cung cấp một trường hợp đặc biệt. –

+0

NOT NULL không phải là một phần của kiểu dữ liệu. Đó là một phần của định nghĩa cột cho một bảng. NULL là không cần thiết. Thee không có khái niệm như NULL INTEGER hoặc NULL VARCHAR. Có, đó là một phần của DDL để xác nhận một cột trong bảng. Vì vậy, là DEFAULT, và do đó là chỉ số và các định nghĩa chính nước ngoài. Có phải chúng ta đang nói rằng các tham số thủ tục lưu trữ được coi là trực giao với các cột trong bảng? – dkretz

39

Bạn có thể kiểm tra NULL-ness trong sproc và RAISERROR để báo cáo trạng thái trở lại vị trí gọi.

CREATE proc dbo.CheckForNull @i int 
as 
begin 
    if @i is null 
    raiserror('The value for @i should not be null', 15, 1) -- with log 

end 
GO 

Sau đó gọi:

exec dbo.CheckForNull @i = 1 

hoặc

exec dbo.CheckForNull @i = null 
+0

Hy vọng ai đó sẽ cập nhật câu trả lời này để chấp nhận tên thông số tùy chọn cho thông báo lỗi, chấp nhận tất cả các loại phổ biến (bigint, varchar, ... và chỉ tăng nếu tất cả đều là null). – crokusek

10

Mã của bạn là chính xác, hợp lý và thậm chí thực hành tốt. Bạn chỉ cần đợi SQL Server 2014 hỗ trợ loại cú pháp này.

Sau khi tất cả, tại sao bắt tại thời gian chạy khi bạn có thể tại thời gian biên dịch?

Xem thêm this msdn document và tìm kiếm Natively Compiled trong đó.

Như dkrez nói, nullabiliy không được coi là một phần của định nghĩa kiểu dữ liệu. Tôi vẫn tự hỏi tại sao không.

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