In SQL Server, een tabelwaardefunctie (TVF) is een door de gebruiker gedefinieerde functie die een tabel retourneert. Dit in tegenstelling tot een scalaire functie, die een enkele waarde retourneert.
U kunt een functie met tabelwaarde op dezelfde manier aanroepen als een tabel. U kunt het bijvoorbeeld gebruiken in een SELECT
uitspraak. In sommige gevallen kunnen tabelwaardige functies ook worden gebruikt om gegevens bij te werken, te verwijderen en in te voegen.
Soorten tabelwaardige functies
Wanneer u een functie met tabelwaarde maakt, hebt u de keuze om een Transact-SQL-tabelwaardefunctie of een tabelwaardefunctie van Common Language Runtime (CLR) te maken.
Transact-SQL-tabelwaardige functies
Transact-SQL TVF's kunnen een van de volgende zijn:
- Inline Table-Valued Function (ITVF)
- Als je een ITVF aanmaakt, start je de functiedefinitie met
RETURNS TABLE
, en de daaropvolgendeSELECT
statement definieert de structuur van de retourtabel. - Multi-Statement Table-Valued Function (MSTVF)
- Een functie met tabelwaarde met meerdere instructies kan meerdere instructies bevatten, waarvan de resultaten worden opgeslagen in een variabele die u aan het begin van de functie declareert. Wanneer u dit doet, geeft u expliciet de structuur van de retourtabel op.
CLR-tabelgewaardeerde functies
Vanuit het CLR-perspectief is de syntaxis vergelijkbaar met de T-SQL ITVF, maar iets anders. U specificeert expliciet de structuur van de retourtabel, maar u declareert geen retourvariabele.
CLR-tabelwaardefuncties worden geïmplementeerd als methoden op een klasse in een Microsoft .NET Framework-assembly.
Voor een meer gedetailleerd overzicht van CLR TVF's, zie de Microsoft-documentatie voor CLR Table-Valued Functions.
Voorbeeld 1 – Inline tabel gewaardeerde functie
Hier is een voorbeeld van de T-SQL-code die wordt gebruikt om een inline functie met tabelwaarde te maken.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
We kunnen zien dat dit een inline-tabelwaardefunctie is, omdat deze de structuur van de retourtabel niet specificeert. Er staat gewoon RETURNS TABLE
, en vertrouwt vervolgens op de SELECT
statement om de structuur van de retourtabel te bepalen.
In dit geval vereist de functie dat de naam van de kat als argument wordt doorgegeven.
Zie Een inline-tabelwaarde-functie maken voor voorbeelden van het toevoegen van opties zoals schemabinding en versleuteling.
Schemabinding is meestal een goed idee, omdat het voorkomt dat er nadelige wijzigingen worden aangebracht in de onderliggende objecten waarnaar de functie verwijst.
Voorbeeld 2 – Multi-statement tabel gewaardeerde functie
Hier is hoe we de functie zouden schrijven als we wilden dat het een multi-statement tabelwaardefunctie zou zijn.
CREATE FUNCTION udf_CatsByName_MSTVF( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
In dit geval gebruiken we een variabele van het type tabel genaamd @cats
en we specificeren expliciet de structuur van de retourtabel. De queryresultaten worden opgeslagen in die variabele, die vervolgens wordt geretourneerd wanneer de functie wordt aangeroepen.
Dit voorbeeld doet MSTVF's niet veel recht, omdat ik slechts één enkele verklaring opneem. Het belangrijkste punt van MSTVF's is dat u meerdere instructies kunt opnemen en dat u de uitvoer van die instructies kunt toevoegen aan de return-variabele.
Zie Create a Multi-Statement Table-Valued Function voor een voorbeeld van het gebruik van meerdere instructies, evenals voorbeelden van het toevoegen van opties zoals schemabinding en codering.
Voorbeeld 3 – Selecteer gegevens uit onze tabelwaardefuncties
Dus nu we onze functies hebben gemaakt, kunnen we ze allebei aanroepen met een SELECT
uitspraak.
SELECT * FROM udf_CatsByName_ITVF('Tom'); SELECT * FROM udf_CatsByName_MSTVF('Tom');
Resultaat:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected) +---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected)
Zowel de ITVF als de MSTVF werden aangeroepen met dezelfde syntaxis en gaven allebei hetzelfde resultaat.
Aanroepen van door tabellen gewaardeerde functies
Functies met tabelwaarde kunnen worden aangeroepen waar tabeluitdrukkingen zijn toegestaan in de FROM
clausule van SELECT
, INSERT
, UPDATE
, of DELETE
verklaringen.
Dit betekent dat u gegevens kunt selecteren, gegevens kunt invoegen, gegevens kunt bijwerken en zelfs gegevens kunt verwijderen via een functie met tabelwaarde.
Hier zijn artikelen die ze allemaal demonstreren:
- Gegevens selecteren via een functie met tabelwaarde
- Gegevens bijwerken via een tabelwaardefunctie
- Gegevens invoegen via een tabelwaardefunctie
- Gegevens verwijderen via een tabelwaarde-functie