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.