Visual Studio 2008でアセンブリを作成し、その関数をSQL Server 2005でCLR関数(CREATE FUNCTION)やCLRストアドプロシージャ(CREATE PROCEDURE)として登録しようとすると、以下のようなエラーになります。
メッセージ 6505、レベル 16、状態 1、プロシージャ ProcedureName、行 1
型 ‘ClassName’ がアセンブリ ‘AssemblyName’ に見つかりませんでした。
どうしたものかと途方に暮れたりもしましたが、結局原因がわかりました。
実はクラスをnamespaceに入れていたのですが、これだとEXTERNAL NAMEの指定を次のようにしなければなりません。
AssemblyName.[NamespaceName.ClassName].StaticMethodName
このようにしたくないなら、クラスをnamespaceに含めないようにするのがいいようです。そうすれば素直に
AssemblyName.ClassName.StaticMethodName
のようにできます。
参考: CLR integration – Could not find Type ‘??’ in assembly ‘??’.
実はこの問題、プロジェクトを新規作成するときにSQL Server プロジェクトを選択しておけば、あまりトラブルにはなりません。プロジェクトにCLRストアドプロシージャやCLRユーザ定義関数用のクラスを追加すると、追加されるソースのひな形がnamespaceの指定が入っていないものになるからです。
しかしSQL Serverプロジェクトは参照の追加に制限があるので使い勝手が悪く、私はほとんど使っていません。そのおかげでこんな苦労をしたわけです。