Prova a creare una funzione inline con valori di tabella. Esempio:
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)
Se visualizzi il piano di esecuzione per SELECT non vedrai affatto una menzione della funzione e in realtà ti mostrerai solo le tabelle sottostanti che vengono interrogate. Questo è positivo in quanto significa che le statistiche sulle tabelle sottostanti verranno utilizzate durante la generazione di un piano di esecuzione per la query.
La cosa da evitare sarebbe una funzione valutata in una tabella con più istruzioni poiché le statistiche della tabella sottostante non verranno utilizzate e possono comportare scarse prestazioni a causa di un piano di esecuzione scadente.
Esempio di cosa evitare :
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
Sottilmente diverso, ma con differenze potenzialmente notevoli nelle prestazioni quando la funzione viene utilizzata in una query.