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

Introduktion til Inline Table-Valued Functions (ITVF) i SQL Server

I SQL Server, den indbyggede tabelværdi-funktion er en af ​​to typer Transact-SQL-tabelværdier-funktioner (den anden type er tabelværdi-funktionen med flere sætninger).

Table-valued functions (TVF) er en type brugerdefineret funktion, der returnerer deres resultater som en tabel. De kan derfor forespørges ligesom en normal tabel.

Inline TVF'er (nogle gange omtalt som ITVF'er) har ikke tilknyttede returvariabler. Returværdien er defineret gennem en enkelt SELECT udmelding. Denne erklæring definerer strukturen af ​​returtabellen. Dette er i modsætning til TVF'er med flere sætninger (også kaldet MSTVF'er), som kræver en returvariabel.

ITVF'er bruger heller ikke BEGIN /END syntaks, hvilket er en anden ting, der adskiller dem fra MSTVF'er.

Inline TVF'er anses ofte for at have bedre ydeevne i forhold til multi-statement TVF'er, selvom dette også vil afhænge af, hvad du forsøger at gøre i funktionen.

Eksempel på en inline-tabel-vurderet funktion

Her er et eksempel på en grundlæggende ITVF:

CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int)
RETURNS TABLE
AS
RETURN (  
    SELECT 
      al.ArtistId,
      al.AlbumName,
      g.Genre
    FROM dbo.Albums al 
      INNER JOIN dbo.Artists ar 
        ON al.ArtistId = ar.ArtistId
      INNER JOIN Genres g
        ON al.GenreId = g.GenreId
    WHERE al.ArtistId = @ArtistId
);

GO

Den består grundlæggende af en SELECT erklæring pakket ind i en anden kode. For specifikt at gøre det til en inline TVF, jeg startede funktionen med RETURNS TABLE , tæt efterfulgt af RETURN , og slutter med en SELECT udsagn inden for parentes.

Flere udsagn

Selvom inline tabelværdierede funktioner ikke er designet til flere SELECT sætninger (det er hvad MSTVF'er er til), er det muligt at bruge UNION operator for at kombinere resultatsættet af flere udsagn.

Eksempel:

CREATE FUNCTION [dbo].[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

Funktionsmuligheder

Du kan også specificere ting som, om du vil bruge skemabinding eller ej (det burde du nok) og om du vil kryptere funktionen eller ej.

Skemabinding vil forhindre, at der foretages uønskede ændringer af de underliggende objekter, som funktionen afhænger af (såsom at droppe en tabel, ændre en kolonne osv.).

Kryptering vil konvertere funktionens definition til et sløret format (for at forhindre andre i at kunne læse det).

Se Opret en inline-tabel-værdisat funktion for eksempler på tilføjelse af skemabinding og kryptering til en ITVF.


  1. Forespørgselsoptimering i PostgreSQL. FORKLAR Grundlæggende – Del 2

  2. For sidste gang, NEJ, du kan ikke stole på IDENT_CURRENT()

  3. PostgreSQL - FEJL:kolonnedato kan ikke castes til typedato

  4. Oracle:hvordan får man procent af totalen ved en forespørgsel?