2012-03-01 11 views
0

SQL2008サーバー上のCLR-Assembliesでちょっと遊んでいます。私の最初の考えは「大変でした。今は主ストアドプロシージャを読み込むために25のストアドプロシージャと関数を追加する必要はありません。ただ1つのDLLを作成し、必要なものをすべて追加します。すべてのCLR関数に必要な手順は1つですか?

だから、僕はMSDNから、簡単なHelloWorldの例を試してみましたが、それを呼び出す方法の例として、私が取得:

CREATE PROCEDURE hello 
AS 
EXTERNAL NAME HelloWorld.Procedures.HelloWorld 

これはCLRアセンブリ内の関数を呼び出すための唯一の方法ですか?私はクラス内のすべての関数のための単一のストアドプロシージャを作成せずに呼び出す必要があります。可能?

+0

私はこれが数年前であることを知っていますが、私の答えであなたの質問を正しく解釈すれば私は不思議です。 –

答えて

1

かんたん回答、いいえ!すべてのCLRストアドプロシージャとストアドファンクションには、適切な外部名を持つT-SQLストアドプロシージャまたはストアドファンクション定義が必要です。

+0

私が聞きたい答えではありませんが、正しいと思います。 – Feroc

0

まあ、はい、いいえ。それは、あなたが "関数を呼び出す"ことが何を意味するかによります。

T-SQLからメソッドを直接呼び出す場合は、すべての公開メソッドにT-SQLラッパーオブジェクトが必要です(T-SQLとCLRの間のブリッジとして機能する)。この質問の解釈は、@ Mithrandirの答えでなされた。

ただし、アセンブリ内のプライベート/内部メソッドについて言及している場合は、T-SQLラッパーオブジェクトは必要ありません。

私の最初の考えは次のとおりです: "素晴らしい、今は主ストアドプロシージャを読み込むために25のストアドプロシージャと関数を追加する必要はありません。私はそれで必要なすべてを」。

このステートメントは、公開されたメソッドによって呼び出される内部メソッドをいくつも持つことで、メインプロシージャを乱雑に呼び起こさないようにすることを意味します。同じデータベース内

  • 、及び
  • :公開されたメソッド(T-SQLラッパー・オブジェクトと、すなわちもの)があれば、それらの他のアセンブリであるように、ユーティリティメソッドを共有することができ、さらには他のアセンブリを参照することができます同じ認可ユーザー

これらのユーティリティメソッドは、まだコンテキスト接続を使用してデータアクセスを行うことができます持って、彼らはT-SQLに公開されるメソッドから呼び出されていることを提供する(すなわちSqlFunctionSqlProcedureなどの属性を持っており、対応するT-SQLラッパーオブジェクト)。

公開されたメソッドを持たず、他のアセンブリで参照されるコードのみを含むアセンブリを作成することもできます。この場合、ALTER ASSEMBLYを使用して、VISIBILITYプロパティをに設定することができます(CREATE ASSEMBLYで行うことはできません)。 VISIBILITYが別のアセンブリを参照しているアセンブリでOFFに設定されている場合、外部キーによるカスケード削除と同様に、非表示のアセンブリは自動的に削除されます。

関連する問題