sql >> Database >  >> RDS >> Sqlserver

Wat is een functie met tabelwaarde in SQL Server?

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 daaropvolgende SELECT 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

  1. De Chamilo MySQL-database implementeren voor hoge beschikbaarheid

  2. TimescaleDB inschakelen op een bestaande PostgreSQL-database

  3. Combineren van INSERT-instructies in een gegevensmodificerende CTE met een CASE-expressie

  4. MySQL datumnotatie spiekbriefje