Différence entre une fonction en ligne et une vue

Je suis un débutant dans l'utilisation des fonctions et il me semble qu'une fonction inline est très similaire à une vue. Ai-je raison?

Puis-je avoir des instructions UPDATE dans une fonction?

Après avoir lu la plupart des réponses ici, je voudrais noter qu'il y a une grande différence entre une fonction table en ligne et tout autre type de fonction (TVF scalaire ou multi-ligne).

Un TVF en ligne est simplement une vue paramétrée. Il peut être étendu et optimisé comme une vue. Il n'est pas nécessaire de matérialiser quelque chose avant de "renvoyer des résultats" ou quelque chose comme ça (bien que, malheureusement, la syntaxe a un RETURN .

Un grand avantage que j'ai trouvé d'un TVF en ligne sur une vue est que cela force le paramétrage nécessaire alors qu'avec une vue, vous devez supposer que l'appelant joindra ou restreindra de manière appropriée l'utilisation de la vue.

Par exemple, nous avons beaucoup de grandes tables de faits dans DW avec un model d'écanvas de Kimball typique. J'ai une vue sur un model axé sur la table de fait, qui, sans aucune ressortingction, appelle des centaines de millions de lignes. En utilisant un TVF en ligne avec un paramétrage approprié, les users ne peuvent pas requestr accidentellement toutes les lignes. La performance est essentiellement indiscernable entre les deux.

Aucune différence. Ils sont à la fois développés / non utilisés dans la requête contenant.

Remarque: les vues indexées sont considérées différemment mais peuvent toujours être développées et les fonctions de table à valeurs multiples sont des cases noires de la requête contenant.

Tony Rogerson: VIEWS – ils n'offrent aucun avantage d'optimization; ils sont simplement des macros en ligne – utilisez avec parcimonie

Adam Machanic: fonctions scalaires, inlining et performance: un titre divertissant pour un post ennuyeux

Question SO connexe: L'optimiseur de plan de requête fonctionne-t-il bien avec les fonctions table jointes / filtrées?

DBA effrayant (à la fin)

Enfin, les écritures aux tables ne sont pas autorisées dans les fonctions

Edit, après le commentaire d'Eric Z Beard et downvote …

La question et les réponses (pas seulement les miennes) ne concernent pas les udfs scalaires. "Inline" signifie "fonctions de table en ligne". Des concepts très différents …

Mise à jour: On dirait que j'ai raté la partie "inline". Cependant, je laisse la réponse ici au cas où quelqu'un voudrait lire sur la différence entre les VIEW et les fonctions régulières.

Si vous n'avez qu'une fonction qui sélectionne et affiche datatables, elles sont similaires. Cependant, même dans ce cas, ils ne sont pas identiques car les VIEW peuvent être optimisés par le moteur. Par exemple, si vous exécutez SELECT * FROM view1 WHERE x = 10; et vous avez un index sur le champ de table qui correspond à X, alors il sera utilisé. D'autre part, la fonction construit un set de résultats avant la search, donc vous devrez déplacer WHERE à l'intérieur – cependant, ce n'est pas facile parce que vous pourriez avoir plusieurs colonnes et vous ne pouvez pas ORDER BY tous ceux dans la même instruction select.

Par conséquent, si vous comparez des vues et des fonctions pour la même tâche de donner une "vue" sur des données, alors VIEWS est un meilleur choix.

MAIS, les fonctions peuvent faire beaucoup plus. Vous pouvez effectuer plusieurs requêtes sans avoir besoin de joindre des tables avec JOINS ou UNION. Vous pouvez effectuer des calculs complexes avec les résultats, exécuter des requêtes supplémentaires et générer des données pour l'user. Les fonctions s'apparentent davantage à des procédures stockées capables de renvoyer des sets de données, puis à des vues similaires.

Personne ne semble avoir mentionné cet aspect.

Vous ne pouvez pas avoir d'instructions Update dans une fonction inline, mais vous pouvez écrire des instructions Update contre elles comme s'il s'agissait d'une vue pouvant être Update .

Une grande différence est qu'une fonction peut prendre des parameters alors qu'une vue ne le peut pas.

J'ai tendance à favoriser les VIEWs, étant une implémentation standard et donc portable. J'utilise des fonctions quand la VUE équivalente n'aurait aucun sens sans une clause WHERE.

Par exemple, j'ai une fonction qui interroge une table d'état de time valide relativement grande (table 'history'). S'il s'agissait d'une VUE et que vous essayiez de l'interroger sans clause WHERE, vous obtiendriez beaucoup de données justes (éventuellement!). L'utilisation d'une fonction établit un contrat que si vous voulez datatables, vous devez fournir un identifiant client, un date de début et une date de fin et la fonction est comment j'établis ce contact. Pourquoi pas un proc stocké? Eh bien, je m'attends à ce qu'un user veuille joindre le resultset à d'autres données (tables, VIEWs, fonctions, etc) et une fonction est OMI la meilleure façon de le faire plutôt que, par exemple, requestr à l'user d'écrire le resultset table.

Répondre à votre question sur les mises à jour dans une fonction ( msdn ):

Les seules modifications pouvant être apscopes par les instructions de la fonction sont les modifications apscopes aux objects locaux à la fonction, tels que les sliders locaux ou les variables. Les modifications apscopes aux tables de database, les opérations sur les sliders non locaux, l'envoi de courrier électronique, la modification de catalogue et la génération d'un set de résultats renvoyé à l'user sont des exemples d'actions impossibles à exécuter.

Une vue est une "vue" de données renvoyées à partir d'une requête, presque une pseudo-table. Une fonction renvoie une valeur / table généralement dérivée de l'interrogation des données. Vous pouvez exécuter n'importe quelle instruction sql dans une fonction à condition que la fonction returnne éventuellement une valeur / table.

Une fonction vous permet de passer des parameters pour créer une vue plus spécifique. Disons que vous vouliez avoir des clients basés sur l'état. Une fonction vous permettrait de passer dans l'état que vous searchz et de vous donner tous les clients par cet état. Une vue ne peut pas faire ça.

Une fonction effectue une tâche ou de nombreuses tâches. Une vue récupère des données via une requête. Ce qui correspond à cette requête est ce que vous êtes limité aussi. Dans une fonction, je peux mettre à jour, sélectionner, créer des variables de table, supprimer des données, envoyer un email, interagir avec un CLR que je crée, etc. Beaucoup plus puissant qu'un humble vue!