sql >> Database >  >> RDS >> Sqlserver

Maak een scalaire door de gebruiker gedefinieerde functie in SQL Server

In SQL Server kunt u een door de gebruiker gedefinieerde scalaire functie maken met behulp van de CREATE FUNCTION uitspraak. Een scalaire door de gebruiker gedefinieerde functie, ook wel bekend als een scalaire UDF, is een door de gebruiker gedefinieerde functie die een enkele waarde retourneert.

Dit artikel bevat voorbeelden van het maken van enkele basis-T-SQL scalaire UDF's.

Syntaxis

Laten we eerst eens kijken naar de syntaxis voor het maken van scalaire UDF's.

De syntaxis voor T-SQL scalaire UDF's gaat als volgt:

 
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]

En de syntaxis voor CLR scalaire UDF's:

 
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
)  
RETURNS { return_data_type }  
    [ WITH <clr_function_option> [ ,...n ] ]  
    [ AS ] EXTERNAL NAME   
[ ; ]  

De onderdelen bij <function_option> voor T-SQL-functies en <clr_function_option> voor CLR-functies kunt u opties voor de UDF specificeren. Functie-opties omvatten het toevoegen van codering, schemabinding, een EXECUTE AS clausule, evenals specificeren wat te doen wanneer een NULL-waarde als argument wordt doorgegeven.

Een volledige lijst met argumenten en functie-opties is te vinden op de Microsoft-website.

De Microsoft-documentatie bevat veel details, dus de volgende voorbeelden zijn bedoeld om een ​​snel overzicht te geven van enkele algemene concepten en opties bij het maken van scalaire UDF's.

Voorbeeld 1 – Basis scalaire UDF

Hier is een voorbeeld van de code die wordt gebruikt om een ​​standaard T-SQL scalaire UDF te maken.

CREATE FUNCTION dbo.ufn_discountPrice( 
    @price DECIMAL(12,2), 
    @discount DECIMAL(12,2) 
    ) 
RETURNS DECIMAL (12,2)
AS
BEGIN
  RETURN @price * (1 - @discount);
END;

Deze scalaire UDF accepteert twee parameters; @price en @discount . Deze worden als argumenten aan de functie doorgegeven wanneer de functie wordt aangeroepen. De functie neemt de waarde van die argumenten, voert een berekening uit met die waarden en retourneert vervolgens de resulterende waarde. In dit geval wordt de kortingsprijs geretourneerd.

Voorbeeld 2 – Roep de UDF op

Nadat de UDF is gemaakt, kan deze op elk gewenst moment binnen de T-SQL-code worden aangeroepen.

Hier is een voorbeeld van het aanroepen van de UDF:

SELECT dbo.ufn_discountPrice(100, .2) AS Result;

Resultaat

+----------+
| Result   |
|----------|
| 80.00    |
+----------+

Voorbeeld 3 – Een tabel opvragen

Scalaire UDF's kunnen ook dingen doen zoals databasetabellen opvragen.

Hier is er een die het aantal albums retourneert dat zich in de database voor een bepaalde artiest bevindt.

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

Dit is een scalaire functie omdat deze een enkele waarde retourneert. Als we een lijst met albums wilden retourneren, zouden we een functie met tabelwaarde moeten gebruiken, omdat functies met tabelwaarde de resultaten als een reeks rijen retourneren.

Voorbeeld 4 – Schemabinding

Wanneer u een door de gebruiker gedefinieerde functie maakt die afhankelijk is van andere objecten in de database, is het meestal een goed idee om de UDF schema te binden. Schemabinding aan de UDF zorgt ervoor dat er geen wijzigingen kunnen worden aangebracht aan de onderliggende objecten die mogelijk van invloed kunnen zijn op de functie.

U kunt bijvoorbeeld geen tabel verwijderen die een schemagebonden UDF in zijn definitie gebruikt.

Om een ​​UDF schema te binden, gebruikt u WITH SCHEMABINDING in zijn definitie. U moet ook tweedelige namen gebruiken voor alle objecten waarnaar in de UDF wordt verwezen.

Hier is het vorige voorbeeld herschreven zodat het schema gebonden is:

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH SCHEMABINDING
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

Dus ik heb twee dingen veranderd ten opzichte van het eerste voorbeeld. Ik heb WITH SCHEMABINDING . toegevoegd , en ik heb Albums gewijzigd naar dbo.Albums .

Als iemand nu probeert die tabel te laten vallen of er andere wijzigingen in aan te brengen, krijgt hij een foutmelding.

Voorbeeld 5 – Encryptie

Je kunt ook WITH ENCRYPTION . gebruiken om de functie te versleutelen.

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH ENCRYPTION
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

Voorbeeld 6 – NULL-invoer

Wanneer de functie wordt aangeroepen en een van de argumenten NULL is, wordt de hoofdtekst van de functie nog steeds uitgevoerd. Dat wil zeggen, tenzij u expliciet RETURNS NULL ON NULL INPUT . heeft vermeld in de functiedefinitie.

Door die optie op te geven, wordt NULL geretourneerd als een van de argumenten NULL is.

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH RETURNS NULL ON NULL INPUT
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

Als ik de functie aanroep met NULL als argument:

SELECT dbo.ufn_CountAlbums(NULL) AS Result;

Ik krijg een ander resultaat, afhankelijk van wat ik heb gespecificeerd voor deze optie.

Dit is het resultaat wanneer de functie de standaardinstelling gebruikt (CALLED ON NULL INPUT ):

+----------+
| Result   |
|----------|
| 0        |
+----------+

En hier is het resultaat wanneer het RETURNS NULL ON NULL INPUT gebruikt :

+----------+
| Result   |
|----------|
| NULL     |
+----------+

Voorbeeld 7 – Meerdere opties

U kunt meerdere opties scheiden met een komma.

Hier is een voorbeeld dat zowel codering als schemabinding aan de functie toevoegt:

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH ENCRYPTION, SCHEMABINDING
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

Voorbeeld 8 – Een functie wijzigen

U kunt een scalaire UDF wijzigen door CREATE . te vervangen met ALTER .

ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH SCHEMABINDING
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

  1. Een kolom toevoegen die een aaneenschakeling van twee andere Varchar-kolommen vertegenwoordigt

  2. Toegang geweigerd voor gebruiker 'root'@'localhost' (met wachtwoord:YES) (Mysql::Error)

  3. Op afstand verbinding maken met MySQL

  4. Beste databaseveldtype voor een URL