Essayez de créer une fonction table en ligne. Exemple :
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)
Si vous affichez le plan d'exécution pour le SELECT, vous ne verrez aucune mention de la fonction et vous montrerez en fait simplement les tables sous-jacentes interrogées. C'est une bonne chose car cela signifie que les statistiques sur les tables sous-jacentes seront utilisées lors de la génération d'un plan d'exécution pour la requête.
La chose à éviter serait une fonction de table à plusieurs instructions, car les statistiques de table sous-jacentes ne seront pas utilisées et peuvent entraîner de mauvaises performances en raison d'un mauvais plan d'exécution.
Exemple de ce qu'il faut éviter :
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
Subtilement différent, mais avec des différences de performances potentiellement importantes lorsque la fonction est utilisée dans une requête.