Các hàm có giá trị bảng là các dạng xem được tham số hóa "chỉ". Điều này làm cho chúng cực kỳ mạnh mẽ để đóng gói logic mà nếu không sẽ bị ẩn đằng sau một thủ tục được lưu trữ không rõ ràng. Đây là một ví dụ:
Chức năng có giá trị trong bảng nội tuyến:
create function dbo.GetClients (
@clientName nvarchar(max) = null
)
returns table
return (
select *
from dbo.Clients as a
where ((a.ClientName = @clientName) or a.ClientName is null)
);
Quy trình được lưu trữ:
create procedure dbo.usp_GetClients (
@clientName nvarchar(max) = null
)
as
begin;
select *
from dbo.Clients as a
where ((a.ClientName = @clientName) or a.ClientName is null)
end;
Không giống như lệnh gọi thủ tục được lưu trữ, một hàm có giá trị bảng cho phép tôi soạn logic từ dbo.GetClients
với các đối tượng khác:
select *
from dbo.GetClients(N'ACME') as a
join ... as b
on a.ClientId = b.ClientId
Trong những tình huống như vậy, tôi không thể tưởng tượng việc sử dụng một thủ tục được lưu trữ vì nó hạn chế như thế nào khi so sánh với hàm có giá trị bảng. Tôi buộc phải điều chỉnh dữ liệu xung quanh mình bằng cách sử dụng bảng tạm thời, biến bảng hoặc lớp ứng dụng để kết hợp các kết quả từ nhiều đối tượng.
Các hàm có giá trị bảng nội tuyến đặc biệt tuyệt vời vì bit "nội tuyến" có lẽ được giải thích tốt nhất ở đây. Điều này cho phép trình tối ưu hóa xử lý các chức năng như vậy không khác gì các đối tượng mà chúng đóng gói, dẫn đến các kế hoạch hiệu suất gần như tối ưu (giả sử rằng chỉ mục và thống kê của bạn là lý tưởng).