2

バックグラウンド:

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' ;
4

1 に答える 1

2

アセンブリ自体を所有しているSQL ServerがSqlFunctionAttributeのプロパティ値にアクセスできることに気付いた後、最終的にこの問題を解決しました。その場合、"CREATE FUNCTION" T-SQL ステートメントでそのようなプロパティを指定する必要はありません (また、構文もありません)。

次のように機能する関数とチェック制約を自動的に列挙して展開するユーティリティを作成しました。

  1. リフレクションを使用して SqlFunction 属性を持つ関数を検索することにより、指定したクラスで展開可能なすべての静的メソッドを列挙します。また、クエリを実行して、既に配置されているすべての既存のスカラーおよびテーブル値アセンブリ関数を列挙します。次に、これらのリストを、各関数が存在するか存在しないかのいずれかである 1 つのリストにマージします。アセンブリを更新するボタンと、各関数の存在を切り替えるボタンがあり、関数の追加/削除/更新を簡単に行うことができます。

  2. さらに、チェック制約を作成/有効化/チェック/無効化するための 2 つ目のタブをインターフェイスに追加しました。関数に複数回適用できる SqlFunctionCheck という新しい属性を作成しました。この属性には「テーブル」プロパティと「フィールド」プロパティがあり、ユーティリティがチェック制約を構築するのに役立ちます。すべてのチェックをテーブルごとに集計し、"CK_" + table_name という名前のテーブルごとにチェックを作成し、すべてのメソッド呼び出しを "and" で結合する制約式を作成し、そのテーブルに関連付けられたフィールド名を関数に渡します。生成された制約式と、制約が既に存在する場合は SQL Server からクエリされた制約式が表示されます。

IMO、これは、SQL CLR 統合を使用して管理スタジオでデータ型の制約を適用し、コードで SQL クエリを実行し、集中型のデータ (制約) クラスからコード自体全体で使用されるデータを適用するための究極のソリューションです。

インターフェイスのスクリーンショットと関連する関数ヘッダー

于 2009-05-01T22:47:33.647 に答える