Når du opretter en table-valued function (TVF) i SQL Server, kan du enten gøre den til en inline table-valued function (ITVF) eller en multi-statement table-valued funktion (MSTVF). Der er forskelle mellem disse funktionstyper, og de bruger en anden syntaks i overensstemmelse hermed.
Denne artikel dækker forskellen mellem MSTVF'er og ITVF'er.
Forskellene
Her er de vigtigste forskelle mellem MSTVF'er og ITVF'er.
ITVF | MSTVF | |
---|---|---|
RETURNS-syntaksen | Du angiver blot RETURNS TABLE og returtabellens definition vil være baseret på funktionens SELECT udmelding. Det er ikke nødvendigt at angive strukturen af returtabellen. | Dine RETURNS syntaks angiver eksplicit strukturen af returtabellen. Dette gøres ved at erklære en TABLE-variabel, der vil blive brugt til at gemme og akkumulere de rækker, der returneres som værdien af funktionen. |
BEGIN/SLUT-syntaksen | ITVF'er bruger ikke BEGIN /END syntaks. | MSTVF'er bruger BEGIN /END syntaks. |
Ydeevne | Generelt hurtigere end MTSVF'er. | Generelt langsommere end ITVF'er. |
Dataopdateringer | I nogle tilfælde er det muligt at opdatere data i de underliggende tabeller ved hjælp af en ITFV. | Du kan ikke opdatere data i de underliggende tabeller ved hjælp af en MSTVF. |
Syntaks
Lad os se på forskellene i syntaksen for hver funktionstype.
Inline-tabel-vurderet funktion
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ]
Multi-Statement Table-Valued Funktion
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [READONLY] } [ ,...n ] ] ) RETURNS @return_variable TABLE <table_type_definition> [ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN function_body RETURN END [ ; ]
Bemærk, at MSTVF starter med en tabeldefinition, men ITVF har ingen sådan definition.
MSTVF starter med RETURNS @return_variable TABLE
efterfulgt af tabeldefinitionen. Her, @return_variable
er en TABLE-variabel, der bruges til at gemme og akkumulere de rækker, der skal returneres som værdien af funktionen.
Eksempel 1 – Inline-tabel-vurderet funktion
Her er et eksempel på en simpel ITVF.
CREATE FUNCTION udf_PetsByName_ITVF( @PetName varchar(70)) RETURNS TABLE AS RETURN ( SELECT CONCAT('Cat', ' ', CatId) AS PetId, CatName FROM dbo.Cats WHERE CatName = @PetName UNION ALL SELECT CONCAT('Dog', ' ', DogId) AS PetId, DogName FROM dbo.Dogs WHERE DogName = @PetName ); GO
Her vælger jeg fra to tabeller ved hjælp af UNION ALL
, og funktionen returnerer blot resultatet.
Eksempel 2 – Multi-erklærings-tabel-værdi-funktion
Her er et eksempel på at bruge en MTVF til at gøre det samme, men på en anden måde.
CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70)) RETURNS @pets TABLE ( PetId varchar(20), PetName varchar(70) ) AS BEGIN INSERT INTO @pets SELECT CONCAT('Cat', ' ', CatId), CatName FROM dbo.Cats WHERE CatName = @PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName = @PetName; RETURN; END; GO
Funktionen starter med at erklære en TABLE-variabel kaldet @pets
. Ved at gøre dette specificerer vi eksplicit strukturen af returtabellen.
Forespørgslerne i BEGIN
/END
blok gemmes i TABLE-variablen kaldet @pets
.
I dette tilfælde valgte jeg ikke at bruge UNION ALL
. I stedet udførte jeg sætningerne separat og gemte resultaterne af hver enkelt i @pets
variabel.
Eksempel 3 – Tilføj endnu en erklæring til MSTVF
For yderligere at demonstrere "multi-statement"-aspektet af MSTVF'er kan vi tilføje flere sætninger til ovenstående MSTVF og gemme resultaterne i den samme returneringsvariabel.
Eksempel:
CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70)) RETURNS @pets TABLE ( PetId varchar(20), PetName varchar(70) ) AS BEGIN INSERT INTO @pets SELECT CONCAT('Cat', ' ', CatId), CatName FROM dbo.Cats WHERE CatName = @PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName = @PetName; IF @@ROWCOUNT = 0 BEGIN INSERT INTO @pets VALUES ( '', 'There are no pets of that name.' ) END RETURN; END; GO
I dette tilfælde tilføjede jeg noget kode for at returnere en speciel besked, når forespørgslen resulterer i, at der ikke returneres rækker.