4

単一のデータベースに一連のカスタム CLR 関数がインストールされています。これらの関数を別のデータベースのクエリ/ビュー/プロシージャで使用する必要がある場合は、3 部構成の名前[db].[schema].[function]()で参照するだけで問題なく動作します。

しかし、エラーのため、計算列では使用できません4120 A user-defined function name cannot be prefixed with a database name in this context

もちろん、2 部構成の名前を使用して同じデータベースに計算列を追加しても問題はありません[schema].[function]()

この問題を解決する方法はありますか? 「元の」ものを参照する他のすべてのデータベースで、ある種の「ショートカット」関数を作成できるでしょうか? または、またはのように、名前のみを使用して関数を呼び出すことができるように、これらの関数をシステム データベースの 1 つにインストールできますleft()substring()?

今のところ、新しい関数の更新とインストールに使用するスクリプトは、関数が必要なすべてのデータベースとmodeldb で同じことを行います。しかし、これを行うためのよりエレガントな方法があればいいのにと思います。

4

2 に答える 2

1

同じエラー/問題が発生したいくつかの CONSTRAINT CHECK の回避策を使用しました。ロジックは、計算列に対しても機能するはずです。

他のデータベースのカスタム関数を、現在のデータベースの新しい関数内にカプセル化します。これを「cf_ref_SameFunctionName」と名付けます。
これは完全ではありませんが、必要な関数ごとに 1 つのラッパーを作成する必要がある場合でも、ロジックを 1 か所にまとめることができます。

長所:

  • あなたのロジックはまだ一箇所にあります
  • 基本関数は参照によってロックされていないため、変更できます。

短所:

  • この関係は、これがもたらす可能性のあるすべての危険とともに、基本機能に壊れています。
于 2014-10-10T12:58:22.337 に答える