Quelle est la différence entre les fonctions table et les vues? Y a-t-il quelque chose que vous pouvez faire avec 1 qui soit difficile ou impossible à faire avec l'autre? Ou la différence réside-t-elle dans l'efficacité?
Un TVF en ligne sans paramètre et une vue non matérialisée sont très similaires. Voici quelques différences fonctionnelles qui vous viennent à l'esprit.
Accepts Parameters - No
Expanded out by Optimiser - Yes
Can be Materialized in advance - Yes (through indexed views)
Is Updatable - Yes
Can contain Multiple Statements - No
Can have triggers - Yes
Can use side-effecting operator - Yes
Accepts Parameters - Yes
Expanded out by Optimiser - Yes
Can be Materialized in advance - No
Is Updatable - Yes
Can contain Multiple Statements - No
Can have triggers - No
Can use side-effecting operator - No
Accepts Parameters - Yes
Expanded out by Optimiser - No
Can be Materialized in advance - No
Is Updatable - No
Can contain Multiple Statements - Yes
Can have triggers - No
Can use side-effecting operator - No
Lors de l'exécution, les vues et les TVF en ligne sont à la fois en ligne et traités de la même manière que les tables dérivées ou les CTE. Ils peuvent très bien ne pas être évalués dans leur intégralité (ou même pas du tout dans certains cas) ou peuvent être évalués plusieurs fois dans d'autres . Les TVF multi-états seront toujours évalués et stockés dans le type de table de retour (essentiellement une variable de table)
J'ai trouvé que les jointures avec des TVF MultiStatement fonctionnent beaucoup mieux que Views lorsqu'un PK est spécifié sur la table de retour de la fonction.
CREATE FUNCTION [FORMREQS].[fnGetFormsStatus] ()
RETURNS
/* Create a PK using two of the columns */
@Indexed TABLE (
[OrgID] [char](8) NOT NULL,
[PkgID] [int] NOT NULL,
[FormID] varchar(5) NOT NULL,
PRIMARY KEY CLUSTERED(OrgID, PkgID)
)
AS
BEGIN
INSERT @Indexed SELECT OrgID, PkgID, FormID FROM FormsTable
RETURN
END