Làm thế nào để objectproperty () tìm ra nếu một hàm là xác định trong máy chủ sql?


7

Làm thế nào để máy chủ sql xác định nếu một chức năng là xác định hay không?

Hãy xem xét hàm sau, tôi nghĩ nó có tính xác định (vì cuối cùng nó là một phép toán số nguyên), nhưng máy chủ sql trả về 0 khi tôi gọi phương thức objectproperty trên nó.

Hiểu cách thức hoạt động của nó sẽ giúp tôi hiểu lý do tại sao tôi đánh giá sai chức năng này.

CREATE FUNCTION dbo.EndOfPreviousMonth ( @Date date )
RETURNS date
AS BEGIN
    RETURN DATEADD(day, 0 - DAY(@Date), @Date);
END;

SELECT dbo.EndOfPreviousMonth('2010-01-01'); --Usage example

--Returns 0, I expected it to return 1
SELECT OBJECTPROPERTY( OBJECT_ID( 'dbo.EndOfPreviousMonth' ), 'IsDeterministic' );

Bạn đang chạy trong chế độ tương thích cho bất cứ điều gì? (Bỏ qua trước đó, DATEADD mang tính quyết định.)
Simon Righarts

Không, tôi không nghĩ vậy. Tôi đoán đó là để nói rằng tôi đã không thiết lập chế độ tương thích.
Brian Dishaw

Câu trả lời:


7

Đầu tiên, nó xem liệu các chức năng được sử dụng là xác định .
Sau đó, xem xét chức năng của bạn là lược đồ ràng buộc.
(Hoặc theo thứ tự ngược lại.)

Vì vậy, thêm with schemabindingvào chức năng của bạn.


Điều đó đã thay đổi câu trả lời cho những gì tôi đang mong đợi, nhưng tại sao?
Brian Dishaw

@BrianDishaw Tôi không chắc chắn, thành thật mà nói. Rõ ràng bởi vì bất kỳ chức năng truy cập dữ liệu nào đều không mang tính xác định trừ khi bị ràng buộc bởi lược đồ và SQL Server mở rộng hành vi này thành các chức năng không thực sự truy cập dữ liệu. Có lẽ nó không thể thấy họ không.
GSerg

Tôi cũng không hiểu. Sẽ có ý nghĩa hơn nếu tôi có một cái gì đó trong chức năng mà tôi có thể bỏ. Oh tốt, cảm ơn vì đã dành thời gian để trả lời câu hỏi của tôi!
Brian Dishaw

2
Giải thích tại đây
Paul White 9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.