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

Vytvořte UDF vázaný na schéma na serveru SQL Server

V SQL Serveru je obvykle dobrý nápad svázat schémata uživatelem definované funkce (UDF).

Vazba schématu vašeho UDF zajistí, že základní tabulky nelze změnit způsobem, který by ovlivnil vaši funkci. Bez vazby schématu by mohly být základní tabulky nebo jiné objekty upraveny nebo dokonce odstraněny. Mohlo by dojít k přerušení funkce.

Chcete-li vytvořit UDF vázané na schéma, použijte WITH SCHEMABINDING ve vašem T-SQL kódu pro vytvoření funkce. To platí bez ohledu na to, zda se jedná o funkci skalární nebo funkci s hodnotou tabulky (TVF).

V každém případě jsem uvedl příklady inline TVF, vícepříkazové TVF a skalární funkce.

Příklad 1 – Inline Table-Valued Function

Zde je příklad vytvoření inline TVF 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'.

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 2 – Funkce s tabulkovou hodnotou s více příkazy

S vícepříkazovými TVF umístíte WITH SCHEMABINDING za specifikací návratové proměnné.

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70)) VRACÍ @pets TABLE ( PetId varchar(20), PetName varchar(70) ) S SCHEMABINDINGASBEGIN INSERT INTO @pets SELECT CONCAT(dI'Cat', CatdI'Cat' ), CatName FROM dbo.Cats WHERE CatName =@PetName; INSERT INTO @pets SELECT CONCAT('Pes', ' ', DogId), PsíJméno FROM dbo.Dogs WHERE PsíJméno =@JménoPsa; POKUD @@ROWCOUNT =0 ZAČNĚTE INSERT INTO @pets VALUES ( '', 'Neexistují žádná zvířata tohoto jména.' ) END RETURN;END;GO

Příklad 3 – Skalární funkce

Zde je příklad skalární funkce:

VYTVOŘIT FUNKCI dbo.ufn_CountAlbums (@ArtistId int) VRACÍ smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;GO

Příklad 4 – Přidání více argumentů

Můžete zadat více argumentů jako seznam oddělený čárkami. Pokud například chcete zadat vazbu schématu a šifrování, pak je budete muset přidat jako seznam oddělený čárkami.

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) 
  1. Vyhledejte hodnotu ve sloupci hodnota, která ukládá hodnoty oddělené čárkami

  2. Začínáme s aplikací Oracle Application Express-APEX

  3. Integrujte Firebase s PHP pro komunikaci v reálném čase

  4. Může se JavaScript propojit s MySQL?