UDF trong MSSQL không được phép có các tác dụng phụ, mà BOL định nghĩa là "thay đổi trạng thái cơ sở dữ liệu". Đó là một mô tả khá mơ hồ, nhưng MSSQL rõ ràng xem xét lỗi để thay đổi trạng thái cơ sở dữ liệu - UDF này không biên dịch:
create function dbo.foo()
returns int
as
begin
raiserror('Foo', 16, 1)
return 1
end
go
Các thông báo lỗi là:
Msg 443, Level 16, State 14 , Quy trình foo, Dòng 5 Sử dụng không hợp lệ một nhà điều hành tác động phụ 'RAISERROR' trong một hàm.
Nếu việc tăng lỗi được xem là thay đổi trạng thái cơ sở dữ liệu, sau đó bẫy và xử lý một biến có lẽ là quá. Đó không phải là một lời giải thích, tôi thừa nhận.
Tuy nhiên, trong điều kiện thực tế, tốt nhất là hãy để người gọi quyết định cách xử lý lỗi. Giả sử bạn viết một hàm như thế này:
create function dbo.divide (@x int, @y int)
returns float
as
begin
return @x/cast(@y as float)
end
Làm thế nào bạn sẽ xử lý các trường hợp một ứng dụng đi không cho @y? Nếu bạn bắt được phân chia bằng không ngoại lệ, bạn sẽ làm gì tiếp theo? Giá trị nào bạn có thể trả về từ hàm có ý nghĩa với người gọi, nhớ rằng bạn thậm chí có thể không biết ứng dụng nào đang gọi hàm của bạn?
Bạn có thể nghĩ đến việc trả về NULL, nhưng các nhà phát triển ứng dụng có sử dụng chức năng của bạn đồng ý không? Tất cả các ứng dụng của họ có cân nhắc sai số bằng 0 để có cùng tác động hoặc tầm quan trọng không? Chưa kể rằng NULL ở những nơi nhất định hoàn toàn có thể thay đổi kết quả của một truy vấn, có lẽ theo cách mà nhà phát triển ứng dụng không muốn chút nào.
Nếu bạn là nhà phát triển duy nhất, có thể đó không phải là vấn đề, nhưng với nhiều người, nó nhanh chóng trở thành một.
+1 câu hỏi hay – kevchadders