Tôi đã chạy một số bài kiểm tra với một bit logic chạy dài, với cùng một bit mã (một câu lệnh SELECT dài) chạy trong cả Hàm có giá trị bảng và Thủ tục được lưu trữ, và EXEC / SELECT thẳng và mỗi lệnh được thực hiện giống nhau.
Theo ý kiến của tôi, luôn luôn sử dụng Hàm có giá trị bảng thay vì một thủ tục được lưu trữ để trả về một tập kết quả, vì nó làm cho logic dễ dàng hơn và dễ đọc hơn nhiều trong các truy vấn sau đó kết hợp với chúng và cho phép bạn sử dụng lại cùng một logic. Để tránh quá nhiều lần truy cập hiệu suất, tôi thường sử dụng các tham số "tùy chọn" (tức là bạn có thể chuyển NULL cho chúng) để kích hoạt chức năng trả về tập kết quả nhanh hơn, ví dụ:
CREATE FUNCTION dbo.getSitePermissions(@RegionID int, @optPersonID int, optSiteID int)
AS
RETURN
SELECT DISTINCT SiteID, PersonID
FROM dbo.SiteViewPermissions
WHERE (@optPersonID IS NULL OR @optPersonID = PersonID)
AND (@optSiteID IS NULL OR @optSiteID = SiteID)
AND @RegionID = RegionID
Bằng cách này, bạn có thể sử dụng chức năng này cho nhiều trường hợp khác nhau và không ảnh hưởng nhiều đến hiệu suất. Tôi tin rằng điều này hiệu quả hơn việc lọc sau đó:
SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1
Tôi đã sử dụng kỹ thuật này trong một số hàm, đôi khi với một danh sách dài các tham số "tùy chọn" thuộc loại này.