1

私はこの簡単な質問に対する答えを見つけようとしてきましたが、これまでのところそれを理解することはできませんでした。

さまざまなSQLコンテンツ(sprocs、views、triggerなど)を含むMyDb.sqlprojがあるとします。

[追加]->[新しい項目]->[SQLCLR C#]、[ユーザー定義関数]を使用して新しいUDFを追加しました。

例えば:

namespace MyNameSpace
{
 public class MyClass
 {
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    //I use different attributes here, but it doesn't matter
    public static int Method1()
    {
       return 0;
    }
 }
}

MyDb.sqlprojプロパティで、SQLCLRタブMyDbはアセンブリの名前とデフォルトの名前空間です

私のSQLコードでは、EXTERNALNAMEを使用してclrメソッドを呼び出します。

CREATE PROCEDURE ClrMethod1
  RETURNS [int] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [MyDb].[MyNamespace.MyClass].[Method1]

最後の行をコンパイルするためにあらゆることを試みたようです。参照を解決して取得することはできません:

SQL71501:関数:[私のsql関数の名前]にアセンブリ[MyDb]への未解決の参照があります

それを機能させる正しい方法を教えてください。何が欠けている可能性がありますか?

VS2010SP1と最新バージョンのSSDTを使用しています

4

1 に答える 1

2

CLRコードを含むコンパイル済みDLLを参照として追加する必要があります。したがって、MyDb SSDTプロジェクト->参照(右クリック)->参照の追加の下で、DLLを参照します。

同じソリューションにCLR(クラスライブラリ)プロジェクトがある場合は、DLLの代わりにプロジェクトを参照することで解決できる可能性がありますが、私の場合はDLL(別のソリューション用にコンパイルされたもの)を参照しています。

行の形式に関する限りAS EXTERNAL NAME

AS EXTERNAL NAME [AssemblyName].[ClassName].[FunctionName]

注: CLRオブジェクトの場合、この手順が通常最も問題になるため、単純化するためにクラス/コードの周囲から名前空間を削除します。AssmeblyName/DLLの名前/名前空間を混同するのは簡単です。AssemblyNameは、CLRクラスライブラリプロジェクトで、[プロジェクトのプロパティ]->[アプリケーション]->[アセンブリ名:]にアクセスして見つけることができます。名前を単純化し、問題として除外するために、英数字以外のスペースを削除します。

だから私はそれを試してみます、そしてあなたがそれを機能させたら、本当に名前空間が必要な場合は、名前空間を追加してそこから構文を理解することができます、そして少なくとも他の部分が正しいことを知っています。


実際には同じSSDTプロジェクト内に*.csファイルがあることに気づきました。その場合、コードがこれである場合:

CSファイル:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString SqlFunction1()
    {
        // Put your code here
        return new SqlString (string.Empty);
    }
}

SQLファイル:

CREATE PROCEDURE ClrMethod1
  RETURNS [int] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [MyDB].[UserDefinedFunctions].[SqlFunction1]

これは私のためにコンパイルします。 注:ここでも、名前空間は使用されていません。[新しいアイテムを追加]を実行したとき、生成されたコードに名前空間が付属していませんでした。

于 2012-05-21T20:08:41.740 に答える