Hãy thử tạo một hàm có giá trị bảng nội tuyến. Ví dụ:
CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
RETURNS TABLE
AS
RETURN
(
SELECT Field1, Field2
FROM SomeTable
WHERE Field3 = @Parameter1
)
-- Then call like this, just as if it's a table/view just with a parameter
SELECT * FROM dbo.fxnExample(1)
Nếu bạn xem kế hoạch thực thi cho SELECT, bạn sẽ không thấy đề cập đến hàm và thực sự sẽ chỉ hiển thị cho bạn các bảng bên dưới đang được truy vấn. Điều này là tốt vì nó có nghĩa là thống kê trên các bảng bên dưới sẽ được sử dụng khi tạo kế hoạch thực thi cho truy vấn.
Điều cần tránh là một hàm có giá trị trong bảng nhiều câu lệnh vì thống kê bảng bên dưới sẽ không được sử dụng và có thể dẫn đến hiệu suất kém do kế hoạch thực thi kém.
Ví dụ về những điều cần tránh :
CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
RETURNS @Results TABLE(Field1 VARCHAR(10), Field2 VARCHAR(10))
AS
BEGIN
INSERT @Results
SELECT Field1, Field2
FROM SomeTable
WHERE Field3 = @Parameter1
RETURN
END
Khác biệt một chút, nhưng có sự khác biệt lớn về hiệu suất khi hàm được sử dụng trong một truy vấn.