SQL Serverでは、CREATE FUNCTION
を使用してスカラーユーザー定義関数を作成できます。 声明。スカラーユーザー定義関数は、スカラーUDFとも呼ばれ、単一の値を返すユーザー定義関数です。
この記事には、いくつかの基本的なT-SQLスカラーUDFの作成例が含まれています。
構文
まず、スカラーUDFを作成するための構文を見てみましょう。
T-SQLスカラーUDFの構文は次のようになります。
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 [ ; ]
そして、CLRスカラーUDFの構文:
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[ ; ]
<function_option>
のパーツ T-SQL関数および<clr_function_option>
の場合 CLR関数の場合、UDFのオプションを指定できます。関数オプションには、暗号化、スキーマバインディング、EXECUTE AS
の追加が含まれます 句、およびNULL値が引数として渡されたときに何をするかを指定します。
引数と関数オプションの完全なリストは、MicrosoftのWebサイトにあります。
Microsoftのドキュメントには多くの詳細が含まれているため、次の例は、スカラーUDFを作成する際のいくつかの一般的な概念とオプションの概要を説明することを目的としています。
例1-基本的なスカラーUDF
これは、基本的なT-SQLスカラーUDFを作成するために使用されるコードの例です。
CREATE FUNCTION dbo.ufn_discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) RETURNS DECIMAL (12,2) AS BEGIN RETURN @price * (1 - @discount); END;
このスカラーUDFは2つのパラメーターを受け入れます。 @price
および@discount
。これらは、関数が呼び出されるたびに引数として関数に渡されます。この関数は、これらの引数の値を取得し、それらの値を使用して計算を実行してから、結果の値を返します。この場合、割引価格が返されます。
例2–UDFを呼び出す
UDFが作成されると、必要なときにいつでもT-SQLコード内で呼び出すことができます。
UDFを呼び出す例は次のとおりです。
SELECT dbo.ufn_discountPrice(100, .2) AS Result;
結果
+----------+ | Result | |----------| | 80.00 | +----------+
例3–テーブルのクエリ
Scalar UDFは、データベーステーブルのクエリなども実行できます。
これは、特定のアーティストのデータベースにあるアルバムの数を返すものです。
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;
単一の値を返すため、これはスカラー関数です。アルバムのリストを返したい場合は、テーブル値関数を使用する必要があります。これは、テーブル値関数が結果を行のセットとして返すためです。
例4–スキーマバインディング
データベース内の他のオブジェクトに依存するユーザー定義関数を作成する場合、通常はUDFをスキーマバインドすることをお勧めします。 UDFをスキーマバインドすると、関数に影響を与える可能性のある基になるオブジェクトに変更を加えることができなくなります。
たとえば、スキーマにバインドされたUDFがその定義で使用するテーブルを削除することはできません。
UDFをスキーマバインドするには、WITH SCHEMABINDING
を使用します その定義で。また、UDFで参照されるオブジェクトには2つの部分からなる名前を使用する必要があります。
スキーマにバインドされるように書き直された前の例は次のとおりです。
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;
そこで、最初の例から2つ変更しました。 WITH SCHEMABINDING
を追加しました 、Albums
を変更しました dbo.Albums
へ 。
これで、誰かがそのテーブルを削除したり、他の変更を加えようとすると、エラーが発生します。
例5–暗号化
WITH ENCRYPTION
を使用することもできます 関数を暗号化します。
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;
例6–NULL入力
関数を呼び出すときに、引数のいずれかがNULLの場合でも、関数の本体は実行されます。つまり、RETURNS NULL ON NULL INPUT
を明示的に指定していない限り 関数の定義で。
このオプションを指定すると、引数のいずれかがNULLの場合にNULLが返されます。
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;
NULLを引数として使用して関数を呼び出すと:
SELECT dbo.ufn_CountAlbums(NULL) AS Result;
このオプションに指定した内容に応じて、異なる結果が得られます。
関数がデフォルト設定(CALLED ON NULL INPUT
)を使用した場合の結果は次のとおりです。 ):
+----------+ | Result | |----------| | 0 | +----------+
RETURNS NULL ON NULL INPUT
を使用した場合の結果は次のとおりです。 :
+----------+ | Result | |----------| | NULL | +----------+
例7–複数のオプション
複数のオプションはコンマで区切ることができます。
関数に暗号化とスキーマバインディングの両方を追加する例を次に示します。
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;
例8–関数を変更する
CREATE
を置き換えることで、スカラーUDFを変更できます。 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;