Probeer een inline functie met tabelwaarde te maken. Voorbeeld:
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)
Als u het uitvoeringsplan voor de SELECT bekijkt, ziet u helemaal geen vermelding van de functie en ziet u alleen de onderliggende tabellen die worden opgevraagd. Dit is goed omdat het betekent dat statistieken over de onderliggende tabellen worden gebruikt bij het genereren van een uitvoeringsplan voor de query.
Het ding dat u moet vermijden is een functie met meerdere verklaringen voor tabellen, aangezien onderliggende tabelstatistieken niet worden gebruikt en tot slechte prestaties kunnen leiden als gevolg van een slecht uitvoeringsplan.
Voorbeeld van wat u vermijdt :
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
Subtiel anders, maar met potentieel grote prestatieverschillen wanneer de functie in een query wordt gebruikt.