SQL Serverでは、通常、ユーザー定義関数(UDF)をスキーマバインドすることをお勧めします。
UDFをスキーマバインドすると、関数に影響を与えるような方法で基になるテーブルを変更できないようになります。スキーマバインディングがないと、基になるテーブルやその他のオブジェクトが変更されたり、削除されたりする可能性があります。これを行うと、機能が損なわれる可能性があります。
スキーマにバインドされたUDFを作成するには、WITH SCHEMABINDING
を使用します 関数を作成するためのT-SQLコードで。これは、関数がスカラー関数であるかテーブル値関数(TVF)であるかに関係なく適用されます。
いずれにせよ、インラインTVF、マルチステートメントTVF、およびスカラー関数の例を含めました。
例1-インラインテーブル値関数
スキーマバインディングを使用してインラインTVFを作成する例を次に示します。
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.
例2–マルチステートメントテーブル値関数
マルチステートメントTVFでは、WITH SCHEMABINDING
を配置します 戻り変数の指定後。
CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70)) RETURNS @pets TABLE ( PetId varchar(20), PetName varchar(70) ) WITH SCHEMABINDING AS BEGIN INSERT INTO @pets SELECT CONCAT('Cat', ' ', CatId), CatName FROM dbo.Cats WHERE CatName = @PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName = @PetName; IF @@ROWCOUNT = 0 BEGIN INSERT INTO @pets VALUES ( '', 'There are no pets of that name.' ) END RETURN; END; GO
例3–スカラー関数
スカラー関数の例を次に示します。
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; GO
例4–複数の引数の追加
複数の引数をコンマ区切りのリストとして指定できます。たとえば、スキーマバインディングをおよび指定する場合 暗号化する場合は、これらをカンマ区切りのリストとして追加する必要があります。
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を含むテーブルを返します。