sql >> Database >  >> RDS >> Sqlserver

Verschil tussen multi-statement tabelwaardige functies en inline tabelwaardige functies in SQL Server

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.


  1. PostgreSQL-ondersteuning inschakelen in PHP op Mac OS X

  2. Willekeurige waarde voor kolom DATETIME

  3. Gegevens exporteren naar een plat bestand met BCP Utility en gegevens importeren met Bulk Insert

  4. SQL-fout ORA-01722:ongeldig nummer