sql >> Databasteknik >  >> RDS >> Sqlserver

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

I SQL Server, den inline-tabellvärderade funktionen är en av två typer av Transact-SQL-tabellvärderade funktioner (den andra typen är tabellvärderade funktioner med flera påståenden).

Table-valued functions (TVF) är en typ av användardefinierad funktion som returnerar sina resultat som en tabell. De kan därför frågas precis som en vanlig tabell.

Inline TVFs (ibland kallade ITVFs) har inte associerade returvariabler. Returvärdet definieras genom en enda SELECT påstående. Detta uttalande definierar strukturen för returtabellen. Detta till skillnad från TVF:er med flera påståenden (även kallade MTVFs), som kräver en returvariabel.

ITVF:er använder inte heller BEGIN /END syntax, vilket är en annan sak som skiljer dem från MSTVFs.

Inline TVF anses ofta ha bättre prestanda jämfört med multi-statement TVF, även om detta också beror på vad du försöker göra i funktionen.

Exempel på en inline-tabellvärderad funktion

Här är ett exempel på en grundläggande 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 i princip av en SELECT uttalande insvept i någon annan kod. För att specifikt göra det till en inline TVF, jag startade funktionen med RETURNS TABLE , tätt följt av RETURN , och slutar med en SELECT uttalande inom parentes.

Flera uttalanden

Även om inline-tabellvärdade funktioner inte är designade för flera SELECT uttalanden (det är vad MSTVF är till för), är det möjligt att använda UNION operatorn för att kombinera resultatuppsättningen av flera satser.

Exempel:

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

Funktionsalternativ

Du kan också specificera saker som om du ska använda schemabindning eller inte (det borde du förmodligen) och om du ska kryptera funktionen eller inte.

Schemabindning kommer att förhindra att några negativa ändringar görs av de underliggande objekten som funktionen beror på (som att ta bort en tabell, ändra en kolumn, etc).

Kryptering kommer att konvertera funktionens definition till ett obfuskerat format (för att förhindra att andra kan läsa den).

Se Skapa en inline tabellvärderad funktion för exempel på hur man lägger till schemabindning och kryptering till en ITVF.


  1. lagra postgresql-resultat i bash-variabel

  2. Oracle nummer till C# decimal

  3. SQL Server 2008 personsökningsmetoder?

  4. Använda kryptering för att stärka PostgreSQL-databassäkerheten