Wanneer u een tabelwaardefunctie (TVF) in SQL Server maakt, kunt u er een inline tabelwaardefunctie (ITVF) of een multi-statement tabelwaardefunctie (MSTVF) van maken. Er zijn verschillen tussen deze functietypes en ze gebruiken dienovereenkomstig een andere syntaxis.
Dit artikel behandelt het verschil tussen MSTVF's en ITVF's.
De verschillen
Dit zijn de belangrijkste verschillen tussen MSTVF's en ITVF's.
ITVF | MSTVF | |
---|---|---|
De RETURNS-syntaxis | U vermeldt gewoon RETURNS TABLE en de definitie van de retourtabel zal gebaseerd zijn op de functie SELECT uitspraak. Het is niet nodig om de structuur van de retourtabel te specificeren. | Uw RETURNS syntaxis specificeert expliciet de structuur van de retourtabel. Dit wordt gedaan door een TABLE-variabele te declareren die zal worden gebruikt om de rijen op te slaan en te accumuleren die worden geretourneerd als de waarde van de functie. |
De BEGIN/END-syntaxis | ITVF's gebruiken de BEGIN . niet /END syntaxis. | MSTVF's gebruiken de BEGIN /END syntaxis. |
Prestaties | Over het algemeen sneller dan MTSVF's. | Over het algemeen langzamer dan ITVF's. |
Gegevensupdates | In sommige gevallen is het mogelijk om gegevens in de onderliggende tabellen bij te werken met behulp van een ITFV. | U kunt gegevens in de onderliggende tabellen niet bijwerken met een MSTVF. |
Syntaxis
Laten we eens kijken naar de verschillen in de syntaxis van elk functietype.
Inline tabel gewaardeerde functie
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 [ ) ] [ ; ]
Functie met multi-statement tabelwaarde
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 [ ; ]
Merk op dat de MSTVF begint met een tabeldefinitie, maar de ITVF heeft zo'n definitie niet.
De MSTVF begint met RETURNS @return_variable TABLE
gevolgd door de tabeldefinitie. Hier, @return_variable
is een TABLE-variabele, die wordt gebruikt om de rijen op te slaan en te accumuleren die moeten worden geretourneerd als de waarde van de functie.
Voorbeeld 1 – Inline tabel gewaardeerde functie
Hier is een voorbeeld van een eenvoudige 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
Hier kies ik uit twee tabellen met behulp van UNION ALL
, en de functie retourneert eenvoudig het resultaat.
Voorbeeld 2 – Multi-statement tabel gewaardeerde functie
Hier is een voorbeeld van het gebruik van een MSTVF om hetzelfde te doen, maar op een andere manier.
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
De functie begint met het declareren van een TABLE-variabele met de naam @pets
. Daarbij specificeren we expliciet de structuur van de retourtabel.
De zoekopdrachten binnen de BEGIN
/END
blok worden opgeslagen in de TABLE-variabele met de naam @pets
.
In dit geval heb ik ervoor gekozen om UNION ALL
niet te gebruiken . In plaats daarvan heb ik de instructies afzonderlijk uitgevoerd en de resultaten van elke instructie opgeslagen in de @pets
variabel.
Voorbeeld 3 – Nog een verklaring toevoegen aan de MSTVF
Om het "multi-statement"-aspect van MSTVF's verder te demonstreren, kunnen we meer statements toevoegen aan de bovenstaande MSTVF en de resultaten opslaan in dezelfde retourvariabele.
Voorbeeld:
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
In dit geval heb ik wat code toegevoegd om een speciaal bericht terug te sturen wanneer de query resulteert in het feit dat er geen rijen worden geretourneerd.