In SQL Server können Sie mit CREATE FUNCTION
eine benutzerdefinierte Skalarfunktion erstellen Erklärung. Eine benutzerdefinierte Skalarfunktion, auch Skalar-UDF genannt, ist eine benutzerdefinierte Funktion, die einen einzelnen Wert zurückgibt.
Dieser Artikel enthält Beispiele für die Erstellung einiger grundlegender skalarer T-SQL-UDFs.
Syntax
Schauen wir uns zunächst die Syntax zum Erstellen von skalaren UDFs an.
Die Syntax für skalare T-SQL-UDFs lautet wie folgt:
CREATE [ OR ALTER ] FUNCTION [ Schemaname. ] Funktionsname ( [ { @parameter_name [ AS ][ typ_schema_name. ] parameter_datentyp [ =default ] [ READONLY ] } [ ,...n ] ] ) RETURNS return_data_type [ WITH[ ,...n ] ] [ AS ] BEGIN Funktionskörper RETURN Skalar_Ausdruck END [; ]
Und die Syntax für skalare CLR-UDFs:
CREATE [ OR ALTER ] FUNCTION [ Schemaname. ] Funktionsname ( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type [ =default ] } [ ,...n ] ) RETURNS { return_data_type } [ WITH[ ,...n ] ] [ AS ] EXTERNAL NAME [; ]
Die Teile unter <function_option>
für T-SQL-Funktionen und <clr_function_option>
für CLR-Funktionen können Sie Optionen für die UDF angeben. Zu den Funktionsoptionen gehören das Hinzufügen von Verschlüsselung, Schemabindung, ein EXECUTE AS
-Klausel sowie die Angabe, was zu tun ist, wenn ein NULL-Wert als Argument übergeben wird.
Eine vollständige Liste der Argumente und Funktionsoptionen finden Sie auf der Microsoft-Website.
Die Microsoft-Dokumentation enthält viele Details, daher zielen die folgenden Beispiele darauf ab, einen schnellen Überblick über einige gängige Konzepte und Optionen beim Erstellen von skalaren UDFs zu geben.
Beispiel 1 – Einfache skalare UDF
Hier ist ein Beispiel für den Code, der zum Erstellen einer einfachen skalaren UDF für T-SQL verwendet wird.
CREATE FUNCTION dbo.ufn_discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) RETURNS DECIMAL (12,2)ASBEGIN RETURN @price * (1 - @discount);END;Diese skalare UDF akzeptiert zwei Parameter;
@price
und@discount
. Diese werden der Funktion als Argumente übergeben, wenn die Funktion aufgerufen wird. Die Funktion nimmt den Wert dieser Argumente, führt eine Berechnung mit diesen Werten durch und gibt dann den resultierenden Wert zurück. In diesem Fall wird der ermäßigte Preis zurückgegeben.Beispiel 2 – UDF aufrufen
Sobald die UDF erstellt wurde, kann sie jederzeit innerhalb des T-SQL-Codes aufgerufen werden, wenn Sie sie benötigen.
Hier ist ein Beispiel für den Aufruf der UDF:
SELECT dbo.ufn_discountPrice(100, .2) AS Ergebnis;Ergebnis
+----------+| Ergebnis ||----------|| 80,00 |+----------+Beispiel 3 – Abfrage einer Tabelle
Skalare UDFs können auch Sachen wie Datenbanktabellen abfragen.
Hier ist eines, das die Anzahl der Alben in der Datenbank für einen bestimmten Künstler zurückgibt.
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM Alben WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Dies ist eine Skalarfunktion, da sie einen einzelnen Wert zurückgibt. Wenn wir eine Liste von Alben zurückgeben wollten, müssten wir eine Tabellenwertfunktion verwenden, da Tabellenwertfunktionen ihre Ergebnisse als eine Reihe von Zeilen zurückgeben.
Beispiel 4 – Schemabindung
Wenn Sie eine benutzerdefinierte Funktion erstellen, die von anderen Objekten in der Datenbank abhängt, empfiehlt es sich normalerweise, die UDF an ein Schema zu binden. Die Schemabindung der UDF stellt sicher, dass keine Änderungen an den zugrunde liegenden Objekten vorgenommen werden können, die sich möglicherweise auf die Funktion auswirken könnten.
Beispielsweise könnten Sie keine Tabelle löschen, die eine schemagebundene UDF in ihrer Definition verwendet.
Verwenden Sie zum Schemabinden einer UDF
WITH SCHEMABINDING
in seiner Definition. Sie müssen auch zweiteilige Namen für alle Objekte verwenden, auf die in der UDF verwiesen wird.Hier ist das vorherige Beispiel umgeschrieben, sodass es schemagebunden ist:
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Also habe ich zwei Dinge gegenüber dem ersten Beispiel geändert. Ich habe
WITH SCHEMABINDING
hinzugefügt , und ich habeAlbums
geändert zudbo.Albums
.Wenn nun jemand versucht, diese Tabelle zu löschen oder andere Änderungen daran vorzunehmen, erhält er eine Fehlermeldung.
Beispiel 5 – Verschlüsselung
Sie können auch
WITH ENCRYPTION
verwenden um die Funktion zu verschlüsseln.CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH ENCRYPTIONAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Beispiel 6 – NULL-Eingabe
Wenn beim Aufrufen der Funktion eines der Argumente NULL ist, wird der Hauptteil der Funktion dennoch ausgeführt. Das heißt, es sei denn, Sie haben explizit
RETURNS NULL ON NULL INPUT
angegeben in der Definition der Funktion.Die Angabe dieser Option gibt NULL zurück, wenn eines der Argumente NULL ist.
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH RETURNS NULL ON NULL INPUTAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Wenn ich die Funktion mit NULL als Argument aufrufe:
SELECT dbo.ufn_CountAlbums(NULL) AS Result;Ich erhalte ein anderes Ergebnis, je nachdem, was ich für diese Option angegeben habe.
Hier ist das Ergebnis, wenn die Funktion die Standardeinstellung verwendet (
CALLED ON NULL INPUT
):+----------+| Ergebnis ||----------|| 0 |+----------+Und hier ist das Ergebnis, wenn es
RETURNS NULL ON NULL INPUT
verwendet :+----------+| Ergebnis ||----------|| NULL |+----------+Beispiel 7 – Mehrere Optionen
Sie können mehrere Optionen mit einem Komma trennen.
Hier ist ein Beispiel, das der Funktion sowohl Verschlüsselung als auch Schemabindung hinzufügt:
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) ZURÜCKGABE smallintWITH ENCRYPTION, SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Beispiel 8 – Ändern einer Funktion
Sie können eine skalare UDF ändern, indem Sie
CREATE
ersetzen mitALTER
.ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;