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

Vytvořte funkci Inline Table-Valued Function (ITVF) na serveru SQL Server

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ého Cats ). 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 );GO

Vý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ý skript

Pamatujte, ž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.


  1. Oracle kurzor pro přiřazení

  2. java.sql.SQLException:ORA-03115:nepodporovaný datový typ sítě nebo reprezentace

  3. počet za každé spojení - optimalizace

  4. Jaký je nejelegantnější způsob, jak uložit časové razítko s nanosec v postgresql?