T-SQL CREATE FUNCTION
を使用して、SQL Serverでインラインテーブル値関数(ITVF)を作成できます。 構文。
構文
インラインTVFの公式構文は次のとおりです。
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ]
例1-基本的なITVF
これは、基本的なインラインテーブル値関数の例です。
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
この場合、関数では猫の名前を引数として渡す必要があります。次に、関連するデータを返すために、クエリでこの引数を使用します。
例2–スキーマバインディングの追加
通常は、SCHEMABINDING
を使用して関数をスキーマバインドすることをお勧めします。 口論。
これを行うと、関数に影響を与えるような方法で基になるテーブルを変更できないようになります。
スキーマバインディングがないと、基になるテーブルが変更されたり、削除されたりする可能性があります。これを行うと、機能が損なわれる可能性があります。
これは同じ関数ですが、今回はスキーマバインディングを使用します:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
クエリでテーブルを参照するときに2つの部分からなる名前を使用したことに注意してください(dbo.Cats
を使用しました) Cats
だけでなく、テーブルを参照する場合 )。これを行うことは、オブジェクトをバインドするスキーマの要件です。 2つの部分からなる名前を使用せずにオブジェクトをスキーマバインドしようとすると、エラーが発生します。
関数をスキーマバインドしたので、その定義で参照されているテーブルを削除しようとすると、エラーが発生します:
DROP TABLE Cats;
結果:
Msg 3729, Level 16, State 1, Line 1 Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
ちなみに、2つの部分からなる名前を使用せずに関数を作成しようとすると、次のようになります。
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM Cats WHERE CatName = @CatName ); GOを使用してテーブルを返します。
結果:
Msg 4512, Level 16, State 3, Procedure udf_CatsByName_ITVF, Line 7 Cannot schema bind table valued function 'dbo.udf_CatsByName_ITVF' because name 'Cats' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.
例3–暗号化の追加
ENCRYPTION
を使用して関数を暗号化することもできます 口論。
関数を暗号化する例を次に示します。
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GOを含むテーブルを返します。
関数の定義を表示できなくなりました。
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
結果:
+--------------+ | definition | |--------------| | NULL | +--------------+
Azure Data Studioを介して関数の定義をスクリプト化しようとすると、エラーメッセージも表示されます。
No script was returned when scripting as Create on object UserDefinedFunction
暗号化された関数のテキストは、DACポートを介してシステムテーブルにアクセスするか、データベースファイルに直接アクセスできる特権ユーザーが引き続き利用できることに注意してください。また、デバッガーをサーバープロセスに接続できるユーザーは、実行時にメモリから元のプロシージャを取得できます。