sql >> Databáze >  >> RDS >> Sqlserver

Úvod do funkcí Inline Table-Valued Functions (ITVF) na serveru SQL Server

V SQL Server, funkce vložená tabulka s hodnotou je jedním ze dvou typů funkcí s tabulkovou hodnotou Transact-SQL (druhým typem je funkce s tabulkovou hodnotou s více příkazy).

Tabulkové funkce (TVF) jsou typem uživatelem definovaných funkcí, které vracejí své výsledky jako tabulku. Lze je tedy dotazovat stejně jako normální tabulku.

Inline TVF (někdy označované jako ITVF) nemají přidružené návratové proměnné. Návratová hodnota je definována pomocí jediného SELECT prohlášení. Tento příkaz definuje strukturu návratové tabulky. To je na rozdíl od vícepříkazových TVF (také označovaných jako MSTVF), které vyžadují návratovou proměnnou.

ITVF také nepoužívají BEGIN /END syntaxe, což je další věc, která je odlišuje od MSTVF.

Inline TVF jsou často považovány za ty, které mají lepší výkon než TVF s více příkazy, i když to bude také záviset na tom, co se ve funkci snažíte dělat.

Příklad vložené funkce s hodnotou tabulky

Zde je příklad základního 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

V podstatě se skládá z SELECT příkaz zabalený do nějakého jiného kódu. Aby to bylo konkrétně vložené TVF, spustil jsem funkci pomocí RETURNS TABLE , těsně následovaný RETURN a končící SELECT prohlášení v závorkách.

Více příkazů

Ačkoli vložené funkce s hodnotou tabulky nejsou navrženy pro více SELECT příkazy (k tomu slouží MSTVF), je možné použít UNION operátor pro spojení výsledné sady více příkazů.

Příklad:

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

Možnosti funkcí

Můžete také určit věci jako, zda použít nebo ne použít vazbu schématu (pravděpodobně byste měli) a zda funkci šifrovat či nikoli.

Vazba schématu zabrání jakýmkoli nepříznivým změnám v základních objektech, na kterých funkce závisí (jako je vypuštění tabulky, změna sloupce atd.).

Šifrování převede definici funkce do zamlženého formátu (aby ji ostatní nemohli číst).

Příklady přidání vazby schématu a šifrování do ITVF najdete v části Vytvoření funkce s hodnotou vložené tabulky.


  1. Jak získat pouze číslice z řetězce v mysql?

  2. Proč je ladění výkonu SQL nejdůležitější dovedností správy databází

  3. Třída fondu připojení Oracle

  4. Jak spustit úlohu SQL Server Agent pomocí T-SQL