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
を含むテーブルを返します。