en ligne ou multi-instruction? Comme MSDN les décrit?
gbn le
Réponses:
207
Il existe deux types de fonctions de table. Une qui n'est qu'une instruction select et une qui peut avoir plus de lignes qu'une simple instruction select.
Le premier exemple est connu sous le nom de «fonction à valeur de table en ligne» qui présente des avantages en termes de performances par rapport à une fonction à valeur de table à plusieurs instructions, à savoir que le serveur de base de données peut recomposer la requête avec l'ITVF incorporé dans la requête parente, devenant essentiellement un paramètre VIEWalors qu'un MSTVF se comporte plus comme une procédure stockée opaque (bien qu'avec ses propres avantages par rapport aux sprocs). Les fonctions en ligne doivent être préférées à MSTVF. Si vous avez besoin de calculer et de stocker des valeurs intermédiaires (telles que le résultat d'une expression de fonction scalaire complexe), utilisez une sous-requête.
Dai
1
Il est probablement également intéressant de mentionner que si le résultat de tout ce que vous utilisez pour remplir la variable que vous souhaitez définir est de quelque manière que ce soit généralisable, vous pouvez envisager d'écrire une fonction distincte pour la générer. Cela vous permettrait d'utiliser l'ITVF décrit par @Dai ci-dessus, avec tous les avantages de celui-ci, tout en insérant toujours une valeur générée dynamiquement dans votre fonction. Je viens d'écrire une fonction à l'aide de la solution ci-dessus (merci @MikaelEriksson!) Qui transmet l'un de ses paramètres à une fonction d'assistance pour m'éviter d'avoir à utiliser le formulaire MSTVF.
naughtilus
1
le plus gros coût est l'insertion pour ma fonction et je ne sais pas comment sauter ce coût sans l'insérer dans la variable de table et renvoyer le résultat de select
uzay95
@naughtilus, ce serait formidable de voir un exemple de cela. Avez-vous envisagé de fournir une autre réponse avec votre suggestion?
Réponses:
Il existe deux types de fonctions de table. Une qui n'est qu'une instruction select et une qui peut avoir plus de lignes qu'une simple instruction select.
Cela ne peut pas avoir de variable:
Vous devez faire comme ceci à la place:
la source
VIEW
alors qu'un MSTVF se comporte plus comme une procédure stockée opaque (bien qu'avec ses propres avantages par rapport aux sprocs). Les fonctions en ligne doivent être préférées à MSTVF. Si vous avez besoin de calculer et de stocker des valeurs intermédiaires (telles que le résultat d'une expression de fonction scalaire complexe), utilisez une sous-requête.