Můžete vytvořit inline tabulkovou funkci (ITVF) v SQL Server pomocí T-SQL CREATE FUNCTION
syntaxe.
Syntaxe
Zde je oficiální syntaxe pro inline TVF.
CREATE [ OR ALTER ] FUNCTION [ název_schématu. ] název_funkce ( [ { @název_parametru [ AS ] [ název_typového_schématu. ] typ_dat_parametru [ =výchozí ] [ POUZE PRO ČTENÍ ] } [ ,...n ] ] ) VRACÍ TABULKU [ S[ ,...n ] ] [ JAKO ] RETURN [ ( ] select_stmt [ ) ] [; ]
Příklad 1 – Základní ITVF
Zde je příklad základní funkce vložené tabulky s hodnotou.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) VRÁTÍ TABLEASRETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName =@CatName );GO
V tomto případě funkce vyžaduje, aby bylo jako argument předáno jméno kočky. Tento argument pak použije v dotazu, aby vrátil relevantní data.
Příklad 2 – Přidání vazby schématu
Obvykle je dobrý nápad svázat vaše funkce do schématu pomocí SCHEMABINDING
argument.
Tím zajistíte, že podkladové tabulky nebude možné změnit způsobem, který by ovlivnil vaši funkci.
Bez vazby schématu by mohly být základní tabulky upraveny nebo dokonce odstraněny. Mohlo by dojít k přerušení funkce.
Zde je stejná funkce, ale tentokrát s vazbou schématu:
VYTVOŘIT FUNKCI dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) VRÁTÍ TABULKU S SCHEMABINDINGASRETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName =@CatName );Všimněte si, že jsem při odkazování na tabulku v dotazu použil dvoudílný název (použil jsem
dbo.Cats
při odkazování na tabulku namísto pouhéhoCats
). Toto je požadavek pro vazbu schématu na objekt. Pokud se pokusíte svázat objekt do schématu bez použití dvoudílných názvů, dostanete chybu.Nyní, když jsem svou funkci svázal schématem, pokud se pokusím zrušit tabulku odkazovanou v její definici, zobrazí se chyba:
DROP TABLE Cats;Výsledek:
Zpráva 3729, úroveň 16, stav 1, řádek 1 Nelze DROP TABLE 'cats', protože na ni odkazuje objekt 'udf_CatsByName_ITVF'.Mimochodem, zde je to, co se stane, když se pokusím vytvořit funkci bez použití dvoudílného pojmenování:
VYTVOŘIT FUNKCI dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) VRÁTÍ TABULKU SE SCHEMABINDINGASRETURN ( SELECT CatId, CatName, Phone FROM Cats WHERE CatName =@CatName );GOVýsledek:
Zpráva 4512, úroveň 16, stav 3, procedura udf_CatsByName_ITVF, řádek 7Nelze svázat tabulku s hodnotou funkce 'dbo.udf_CatsByName_ITVF', protože název 'Cats' je pro vazbu schématu neplatný. Názvy musí být ve formátu dvou částí a objekt nemůže odkazovat sám na sebe.Příklad 3 – Přidat šifrování
Své funkce můžete také zašifrovat pomocí
ENCRYPTION
argument.Zde je příklad šifrování funkce:
VYTVOŘIT FUNKCI dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) VRÁTÍ TABULKU SE SCHEMABINDING, ENCRYPTIONASRETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName =@preCatNa)Nyní nemohu zobrazit definici funkce.
SELECT definice FROM sys.sql_modulesWHERE object_id =OBJECT_ID('udf_CatsByName_ITVF');Výsledek:
+---------------+| definice ||---------------|| NULL |+--------------+Při pokusu o skriptování definice funkce prostřednictvím Azure Data Studio se mi také zobrazí chybová zpráva:
Při skriptování jako Create on object UserDefinedFunction nebyl vrácen žádný skriptPamatujte, že text zašifrované funkce je stále dostupný privilegovaným uživatelům, kteří mohou přistupovat k systémovým tabulkám přes port DAC nebo přímo přistupovat k databázovým souborům. Také uživatelé, kteří mohou k procesu serveru připojit ladicí program, mohou za běhu načíst původní proceduru z paměti.