Försök att skapa en inline-tabellvärderad funktion. Exempel:
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)
Om du tittar på exekveringsplanen för SELECT kommer du inte att se något omnämnande av funktionen alls och kommer faktiskt bara att visa dig de underliggande tabellerna som efterfrågas. Detta är bra eftersom det innebär att statistik på de underliggande tabellerna kommer att användas när en exekveringsplan för frågan genereras.
Det man bör undvika skulle vara en funktion som värderas med flera påståenden eftersom underliggande tabellstatistik inte kommer att användas och kan resultera i dålig prestanda på grund av en dålig utförandeplan.
Exempel på vad man ska undvika :
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
Subtilt annorlunda, men med potentiellt stora skillnader i prestanda när funktionen används i en fråga.