sql >> Database teknologi >  >> RDS >> Sqlserver

Forskellen mellem multi-sætning tabel-værdisatte funktioner og inline tabel-værdi-funktioner i SQL Server

Når du opretter en table-valued function (TVF) i SQL Server, kan du enten gøre den til en inline table-valued function (ITVF) eller en multi-statement table-valued funktion (MSTVF). Der er forskelle mellem disse funktionstyper, og de bruger en anden syntaks i overensstemmelse hermed.

Denne artikel dækker forskellen mellem MSTVF'er og ITVF'er.

Forskellene

Her er de vigtigste forskelle mellem MSTVF'er og ITVF'er.

ITVF MSTVF
RETURNS-syntaksen Du angiver blot RETURNS TABLE og returtabellens definition vil være baseret på funktionens SELECT udmelding. Det er ikke nødvendigt at angive strukturen af ​​returtabellen. Dine RETURNS syntaks angiver eksplicit strukturen af ​​returtabellen. Dette gøres ved at erklære en TABLE-variabel, der vil blive brugt til at gemme og akkumulere de rækker, der returneres som værdien af ​​funktionen.
BEGIN/SLUT-syntaksen ITVF'er bruger ikke BEGIN /END syntaks. MSTVF'er bruger BEGIN /END syntaks.
Ydeevne Generelt hurtigere end MTSVF'er. Generelt langsommere end ITVF'er.
Dataopdateringer I nogle tilfælde er det muligt at opdatere data i de underliggende tabeller ved hjælp af en ITFV. Du kan ikke opdatere data i de underliggende tabeller ved hjælp af en MSTVF.

Syntaks

Lad os se på forskellene i syntaksen for hver funktionstype.

Inline-tabel-vurderet funktion

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 [ ) ]  
[ ; ]  

Multi-Statement Table-Valued Funktion

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  
[ ; ]

Bemærk, at MSTVF starter med en tabeldefinition, men ITVF har ingen sådan definition.

MSTVF starter med RETURNS @return_variable TABLE efterfulgt af tabeldefinitionen. Her, @return_variable er en TABLE-variabel, der bruges til at gemme og akkumulere de rækker, der skal returneres som værdien af ​​funktionen.

Eksempel 1 – Inline-tabel-vurderet funktion

Her er et eksempel på en simpel 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

Her vælger jeg fra to tabeller ved hjælp af UNION ALL , og funktionen returnerer blot resultatet.

Eksempel 2 – Multi-erklærings-tabel-værdi-funktion

Her er et eksempel på at bruge en MTVF til at gøre det samme, men på en anden måde.

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

Funktionen starter med at erklære en TABLE-variabel kaldet @pets . Ved at gøre dette specificerer vi eksplicit strukturen af ​​returtabellen.

Forespørgslerne i BEGIN /END blok gemmes i TABLE-variablen kaldet @pets .

I dette tilfælde valgte jeg ikke at bruge UNION ALL . I stedet udførte jeg sætningerne separat og gemte resultaterne af hver enkelt i @pets variabel.

Eksempel 3 – Tilføj endnu en erklæring til MSTVF

For yderligere at demonstrere "multi-statement"-aspektet af MSTVF'er kan vi tilføje flere sætninger til ovenstående MSTVF og gemme resultaterne i den samme returneringsvariabel.

Eksempel:

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

I dette tilfælde tilføjede jeg noget kode for at returnere en speciel besked, når forespørgslen resulterer i, at der ikke returneres rækker.


  1. Er der en måde at indstille en udløbstid, hvorefter en dataindtastning automatisk slettes i PostgreSQL?

  2. Sådan opretter du en unik begrænsning på flere kolonner i SQL Server - SQL Server / TSQL vejledning del 96

  3. Hent Oracle sidst indsatte IDENTITY

  4. Hvordan får man sidste dag i sidste uge i sql?