In SQL Server is de functie met tabelwaarde met meerdere instructies is een van de twee typen Transact-SQL-tabelwaardefuncties (het andere type is de inline tabelwaardefunctie).
Tabelwaardefuncties (TVF) zijn een type door de gebruiker gedefinieerde functie waarvan de resultaten als een tabel worden geretourneerd. Ze kunnen dus net als een normale tabel worden opgevraagd.
Multi-statement TVF's (soms MSTVF's genoemd) kunnen bestaan uit meerdere instructies, waarvan de resultaten worden opgeslagen in een return-variabele. Bovenaan de functie zet je de specificaties van de return-variabele. Dit specificeert de structuur van de retourtabel. Met andere woorden, u specificeert hoeveel kolommen, hun namen, gegevenstypes, enz.
Dit in tegenstelling tot inline TVF's (ook wel ITVF's genoemd), die geen retourvariabele gebruiken (de retourtabel wordt gedefinieerd door de SELECT
uitspraak).
MSTVF's gebruiken ook de BEGIN
/END
syntaxis, iets anders dat hen onderscheidt van ITVF's (ITVF's gebruiken die syntaxis niet).
Voorbeeld van een multi-statement tabelwaardefunctie
Hier is een voorbeeld van een basis-MSTVF:
CREATE FUNCTION dbo.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
Hier start ik de functie door de retourvariabele te definiëren met de naam @pets
. Het is van het type tabel , en het geeft twee kolommen terug.
In dit geval heb ik twee SELECT
statements en een IF
uitspraak. De resultaten van elk worden opgeslagen in de return-variabele. Dit gebeurt via een INSERT
elke keer een verklaring.
Functie-opties
Je kunt ook dingen specificeren zoals of je wel of niet schemabinding wilt gebruiken (waarschijnlijk zou je dat moeten doen) en of de functie wel of niet moet worden versleuteld.
Schemabinding voorkomt dat er nadelige wijzigingen worden aangebracht in de onderliggende objecten waarvan de functie afhankelijk is (zoals het laten vallen van een tabel, het wijzigen van een kolom, enz.).
Versleuteling converteert de definitie van de functie naar een versluierd formaat (om te voorkomen dat anderen het kunnen lezen).
Zie Create a Multi-Valued Table-Valued Function voor voorbeelden van het toevoegen van schemabinding en encryptie aan een ITVF.