sql >> Database >  >> RDS >> Sqlserver

Inleiding tot Inline Table-Valued Functions (ITVF) in SQL Server

In SQL Server is de inline tabelwaardefunctie is een van de twee typen Transact-SQL-tabelwaardefuncties (het andere type is de multi-statement tabelwaardefunctie).

Tabelwaardefuncties (TVF) zijn een type door de gebruiker gedefinieerde functie waarvan de resultaten als een tabel worden geretourneerd. Ze kunnen dus net als een normale tabel worden opgevraagd.

Inline TVF's (ook wel ITVF's genoemd) hebben geen bijbehorende retourvariabelen. De retourwaarde wordt gedefinieerd via een enkele SELECT uitspraak. Deze instructie definieert de structuur van de retourtabel. Dit in tegenstelling tot multi-statement TVF's (ook wel MSTVF's genoemd), die wel een retourvariabele vereisen.

ITVF's gebruiken ook niet de BEGIN /END syntaxis, wat nog iets is dat ze onderscheidt van MSTVF's.

Inline TVF's worden vaak beschouwd als betere prestaties dan TVF's met meerdere instructies, hoewel dit ook afhangt van wat u in de functie probeert te doen.

Voorbeeld van een inline tabel gewaardeerde functie

Hier is een voorbeeld van een standaard 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

Het bestaat in feite uit een SELECT statement verpakt in een andere code. Om er specifiek een inline van te maken TVF, ik heb de functie gestart met RETURNS TABLE , op de voet gevolgd door RETURN , en eindigend met een SELECT verklaring tussen haakjes.

Meerdere uitspraken

Hoewel inline-tabelwaardefuncties niet zijn ontworpen voor meerdere SELECT statements (daar zijn MSTVF's voor), is het mogelijk om de UNION operator om de resultatenset van meerdere instructies te combineren.

Voorbeeld:

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

Functie-opties

Je kunt ook dingen specificeren zoals of je wel of niet schemabinding wilt gebruiken (waarschijnlijk zou je dat moeten doen) en of de functie wel of niet moet worden versleuteld.

Schemabinding voorkomt dat er nadelige wijzigingen worden aangebracht in de onderliggende objecten waarvan de functie afhankelijk is (zoals het laten vallen van een tabel, het wijzigen van een kolom, enz.).

Versleuteling converteert de definitie van de functie naar een versluierd formaat (om te voorkomen dat anderen het kunnen lezen).

Zie Create an Inline Table-Valued Function voor voorbeelden van het toevoegen van schemabinding en encryptie aan een ITVF.


  1. FOUT:relatie plaatsen bestaat niet Heroku db import

  2. hoe te controleren of de database consistent is na onvolledig herstel

  3. Gebruik MySQL relationele databases op Ubuntu 8.04 (Hardy)

  4. Hoe de Unix-tijdstempel in Oracle te retourneren