2017-06-20 3 views
1

私たちは、日付関数を持つCLRアセンブリを含むSQL Serverデータベースを移植しています(開発者は長期間)。私は、DLL(それがsys.assembliesにリストされている)からアセンブリを作成しました:T-SQLはアセンブリでCLR関数を見つけることができません - 名前空間はありませんか?

CREATE ASSEMBLY ArkaDB FROM 'C:\Temp\ArkaDB.dll' WITH PERMISSION_SET = SAFE; 

しかし、私はGetOIDate機能のためのSQLストアドプロシージャを作成しようとすると:

create FUNCTION [dbo].[GetOIDate](@ActivityDate [datetime]) 
RETURNS [datetime] WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [ArkaDB].[ArkaDB.UserDefinedFunctions].[GetOIDate] 

それはエラーになります"Msg 6505、レベル16、状態2、プロシージャGetOIDate、行2 アセンブリ 'ArkaDB'で 'ArkaDB.UserDefinedFunctions'タイプが見つかりませんでした。"

以下のILSpyのスクリーンショットでは、DLLの構造と機能コードを見ることができます。名前空間のダッシュ記号 " - "に注目してください。 this質問から、私たちはEXTERNAL NAME仕様に名前空間を含めることになっています。しかし、名前空間がないとどうなるでしょうか?答えはhereで、「EXTERNAL NAME [SqlClr] .Math。[Add]」のようなクラスを提供するだけであることを示しています。私は私が考えることができるすべてのバリエーションを試してみましたが、それらはすべてのエラー-見つけることができませんでした同じ提供:

EXTERNAL NAME [ArkaDB].[ArkaDB.UserDefinedFunctions].[GetOIDate] 
EXTERNAL NAME [ArkaDB].UserDefinedFunctions.[GetOIDate] 
EXTERNAL NAME [ArkaDB].[.UserDefinedFunctions].[GetOIDate] 
EXTERNAL NAME [ArkaDB].[-.UserDefinedFunctions].[GetOIDate] 
EXTERNAL NAME [ArkaDB].[''.UserDefinedFunctions].[GetOIDate] 
EXTERNAL NAME [ArkaDB].[ .UserDefinedFunctions].[GetOIDate] 

任意のアイデア?私たちはSQL Server 2012を実行していますが、DLLはもともとは2008 R2のために開発されインストールされていました。 ILSpy for ArkaDB DLL

編集:ここsrutzkyのための公共のクラス定義が、残念ながら、私は(十分でない評判)コメントすることはできませんILSpy UserDefinedFunctions class

+0

この1 - 'EXTERNAL NAME [ArkaDB] .UserDefinedFunctionsは[GetOIDate]' - 正しいはずですか、クラス名の周りの角かっこを追加することができます 'EXTERNAL NAME [ArkaDB] [。 UserDefinedFunctions]。[GetOIDate] '。そのクラスは「公開」とマークされていますか? –

+0

返事をありがとう。はい、クラスはpublicです - 上の投稿に追加された画像を参照してください。あなたは正しいべきであるという形式について正しいです。古いデータベースでSQL関数createをスクリプト化すると、 "EXTERNAL NAME [ArkaDB]。[UserDefinedFunctions]。[GetOIDate]"が生成されます。しかし、これは、新しいサーバー "ArkaDB 'アセンブリでタイプ' UserDefinedFunctions 'を見つけることができませんでした"と実行すると、同様のエラーが発生します。私の次のステップは、Visual StudioでDLLを再構築しようとしていますが、これはレガシーコードには常に苦労しています。正しいソースがありますか? VSバージョンの問題はありますか? – user906802

+0

あなたの名前はsys.assembl *テーブルのものと一致していますか?ここに記載されているように:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql 'sys.'のページで検索してください – shibormot

答えて

0

あるので聞かせ; sが代わりに答えてみてください:

あなたが書きました: "古いデータベースでSQL関数createをスクリプト化すると、 "EXTERNAL NAME [ArkaDB]。[UserDefinedFunctions]。[GetOIDate]"。 "が生成されます。古いデータベースからアセンブリをスクリプト化して(ここではうまくいくと思いますが)、新しいデータベースにそのように配置してください。

ような何か:

CREATE ASSEMBLY ArkaDB FROM binary_representation WITH PERMISSION_SET = SAFE; 

あなたは、少なくともそれが展開され得ることができる必要がありますその方法を。アセンブリ内に名前空間が存在しない場合、作成関数はsrutzkyのようになります。

CREATE FUNCTION [dbo].[GetOIDate](@ActivityDate [datetime]) 
RETURNS [datetime] WITH EXECUTE AS CALLER 
EXTERNAL NAME [ArkaDB].[UserDefinedFunctions].[GetOIDate] 

お知らせください。 。

ニールス

関連する問題

 関連する問題