バックグラウンド:
Visual Studio がデータベース プロジェクトの展開に失敗します。新しい関数を追加して既存の関数を更新するだけでなく、既に参照されている関数 (チェック制約など) を削除しようとするため、展開は常に失敗します。
その結果、アセンブリを更新し、関数を追加/更新する独自のコードを作成しています。
コンパイラ/デプロイヤは SqlFunction 属性のリフレクションとプロパティを使用すると想定しているため、リフレクションを使用して、SqlFunction 属性を持つ静的メソッドの MethodInfo リストも収集しています。
質問/タスク:
SqlFunctionAttribute のプロパティ (IsDeterministic、DataAccess、Name、IsPrecise など) と関数のメソッド シグネチャを適切な T-SQL "CREATE FUNCTION" ステートメントに変換する方法を知る必要があります。
役に立たないことが既にわかっている既存の情報:
「関数の作成」のドキュメントは紛らわしく、不完全です。最後に、IsDeterministic などの SqlFunction プロパティのいくつかについて言及していますが、T-SQL パラメーターではなく C# プロパティのように説明されているため、create 関数ステートメントでそれらを使用する方法がわかりません。
//CLR Functions
CREATE FUNCTION [ schema_name. ] function_name
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type
[ = default ] }
[ ,...n ]
)
RETURNS { return_data_type | TABLE <clr_table_type_definition> }
[ WITH <clr_function_option> [ ,...n ] ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]
clr_function_option
パラメーターが IsDeterministic などを処理することを期待していますが、オプションとしてリストされていません。
一方、IBM DB2 のドキュメントでは、次のようなステートメントが見られますが、MSDN のドキュメントにはほとんど似ていません。
CREATE FUNCTION countUp(INTEGER)
RETURNS INTEGER
LANGUAGE CLR
PARAMETER STYLE SQL
SCRATCHPAD 10
FINAL CALL
NO SQL
FENCED
THREADSAFE
NOT DETERMINISTIC
EXECUTION CONTORL SAFE
EXTERNAL NAME 'gwenUDF.dll:bizLogic.empOps!CountUp' ;