Prøv at oprette en indlejret tabelværdi-funktion. Eksempel:
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)
Hvis du ser udførelsesplanen for SELECT, vil du slet ikke se en omtale af funktionen og vil faktisk kun vise dig de underliggende tabeller, der forespørges. Dette er godt, da det betyder, at statistik på de underliggende tabeller vil blive brugt, når der genereres en eksekveringsplan for forespørgslen.
Det, man bør undgå, er en funktion med flere sætninger, da den underliggende tabelstatistik ikke vil blive brugt og kan resultere i dårlig ydeevne på grund af en dårlig eksekveringsplan.
Eksempel på, hvad man skal undgå :
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 anderledes, men med potentielt store forskelle i ydeevne, når funktionen bruges i en forespørgsel.