ユーザー定義関数のデザイン ガイドライン
ユーザー定義関数は、次のように使用できる再利用可能なコードを備えたデータベース オブジェクトとして格納されます。
- SELECT などの Transact-SQL ステートメント内で使用する
- 関数を呼び出すアプリケーション内で使用する
- 別のユーザー定義関数の定義内で使用する
- ビューをパラメータ化したり、インデックス付きビューの機能を向上させる
- テーブルの列を定義する
- 列の CHECK 制約を定義する
- ストアド プロシージャを置換する
Microsoft SQL Server 2005 では、Microsoft .NET Framework がサポートする任意のプログラミング言語で記述された関数を含めるためにユーザー定義関数が拡張されました。また、非決定的関数の使用に関するいくつかの制限事項が取り除かれました。これらの変更は、デザインおよび実装するユーザー定義関数の種類を決定する際に考慮する必要があります。
関数の種類の選択
ユーザー定義関数をデザインするときは、最初にニーズに最適な関数の種類を決定します。関数は次の種類に分類できます。
- スカラ (単一の値) を返します。
- テーブル (複数の行) を返します。
- 複雑な計算を実行します。
- 主に SQL Server データにアクセスします。
Transact-SQL または .NET Framework のいずれかで記述されたユーザー定義関数は、スカラ値とテーブル値の両方を返すことができます。
関数のプロパティ
ユーザー定義関数には、関数を呼び出す計算列のインデックスを使用するか、または関数を参照するインデックス付きビューを使用して、関数の結果にインデックスを作成する SQL Server データベース エンジンの機能を決定する複数のプロパティがあります。これらのプロパティは「CLR ユーザー定義型」のメソッドにもあります。
決定性
決定的関数は、一連の特定の入力値で呼び出され、かつデータベースの状態が同じ場合は、必ず同じ結果を返します。非決定的関数は、アクセスするデータベースの状態が同じ場合でも、一連の特定の入力値で呼び出すたびに、異なる結果を返すことがあります。
データベース エンジンにより、自動的に Transact-SQL 関数の本体が分析され、その関数が決定的関数であるかどうかが評価されます。たとえば、関数から他の非決定的関数が呼び出される場合、または関数から拡張ストアド プロシージャが呼び出される場合は、データベース エンジンにより、その関数が非決定的関数とマークされます。共通言語ランタイム (CLR) 関数の場合、データベース エンジンでは、その関数を決定的関数とマークするために SqlFunction カスタム属性を使用するかどうかが関数の作成者によって決定されます。
精度
ユーザー定義関数は、浮動小数点演算を必要としない場合、正確であるといえます。
データベース エンジンにより、自動的に Transact-SQL 関数の本体が分析され、その関数が正確かどうかが評価されます。CLR 関数の場合、データベース エンジンでは、その関数を正確とマークするために SqlFunction カスタム属性を使用するかどうかが関数の作成者によって決定されます。
DataAccess
このプロパティは、関数により、ローカル データベース サーバーへのアクセスに SQL Server インプロセス マネージ プロバイダが使用されるかどうかを示します。詳細については、「CLR データベース オブジェクトからのデータ アクセス」を参照してください。
データベース エンジンにより、自動的に Transact-SQL 関数の本体が分析され、その関数によってデータ アクセスが実行されるかどうかが評価されます。CLR 関数の場合、データベース エンジンでは、SqlFunction カスタム属性を使用してデータ アクセスの特性を示すのは関数の作成者に任されています。このプロパティは、実行時にデータベース エンジンにより設定されます。関数が DataAccess = None を示している場合に、データ アクセスが実行されると、その関数は実行時に失敗します。
SystemDataAccess
このプロパティは、関数により、ローカル データベース サーバーのシステム メタデータへのアクセスに SQL Server インプロセス マネージ プロバイダが使用されるかどうかを示します。
データベース エンジンにより、自動的に Transact-SQL 関数の本体が分析され、その関数によってシステム データ アクセスが実行されるかどうかが評価されます。CLR 関数の場合、データベース エンジンでは、SqlFunction カスタム属性を使用してシステム データ アクセスの特性を示すのは関数の作成者に任されています。このプロパティは、実行時にデータベース エンジンにより設定されます。関数が SystemDataAccess = None を示している場合に、システム データ アクセスが実行されると、その関数は実行時に失敗します。
IsSystemVerified
このプロパティは、関数の決定性プロパティと精度プロパティをデータベース エンジンで検証できるかどうかを示します。Transact-SQL 関数の場合、このプロパティは、これらの関数によって IsSystemVerified = false とマークされた任意の関数が呼び出される場合を除いて true に設定されます。CLR 関数の場合、このプロパティは false に設定されます。
データベース エンジンにより、関数の IsSystemVerified プロパティは自動的に派生されます。Transact-SQL 関数の場合、関数が、IsSystemVerified = false とマークされている任意の関数にアクセスすると、その関数自体が IsSystemVerified = false とマークされます。
インデックス付き計算列およびインデックス付きビューの関数の詳細については、「計算列に対するインデックスの作成」および「インデックス付きビューの作成」を参照してください。
参照
概念
ユーザー定義テーブル値関数
インライン ユーザー定義関数
決定的関数と非決定的関数
関数としてのストアド プロシージャの書き直し