2016-04-04 12 views
1

データアクセスに関連するSQLCLR集計の制限について理解しています。言いましたが、結果をテーブルに保存する方法(回避策)はありますか? SQLCLR集計内でなければなりません。あなたがC#の機能の準備ができて集計結果を持っていたらSQLCLRユーザー定義集計(UDA)内のデータアクセス

+1

あなたは正確に何を達成しようとしていますか?あなたがしたいことではないかもしれないので、プロセスを説明してください。 –

+0

皆様のお返事ありがとうございます。しかし、私はコード/デザインのレビューや批評を求めていません。私は、ユーザー定義集計関数のコンテキスト内でデータにアクセスするための回避策があることを知りたいだけです。 –

答えて

0

は、なぜあなたはユーザー定義集計(UDA)内のテーブルに集計結果を格納する必要がありますか?それはあなたが無地のT-SQLを使用して、テーブルに結果を格納できることを考えれば少しは意味になります:

INSERT INTO SchemaName.TableName (Col1, Col2, ...) 
    SELECT tab.SomeColumn, SchemaName.CustomAggregate(tab.OtherColumn) 
    FROM SchemaName.TableName tab 
    GROUP BY tab.SomeColumn; 

あなたは組み込み集約関数のいずれかの結果を格納しているかのように基本的に、これは同じように動作します、のような:SUMMINMAXCOUNTAVGなど

ただし、は、外部接続を、いくつかの奇妙な理由のためにこれを行うだけで使用する必要がなかった場合(つまりないContext Connection = true;)でTerminate()メソッドを使用します。

ではなく、の接続が現在のトランザクションコンテキストに参加しようとしていることに注意してください(また、参加はデフォルトの動作です)。つまり、接続文字列には、次のキーワードと値(Enlist = false;)が必要です。私は成功しTerminate()方法で次のように使用され、私も「データアクセスは、このコンテキストで許可されていませんになっていた。どちらのコンテキストがDataAccessKindで関数やメソッドマークされていないEnlist=false;を追加する前にしたように、これは作業を行います.ReadまたはSystemDataAccessKind.Readは、テーブル値関数のFillRowメソッドからデータを取得するためのコールバックであるか、UDT検証メソッドです。 "エラー。

using (SqlConnection _Connection = 
        new SqlConnection("Trusted_Connection=true; Enlist=false;")) 
{ 
    using (SqlCommand _Command = _Connection.CreateCommand()) 
    { 
     _Command.CommandText = "SELECT TOP 1 * FROM sys.objects;"; 
     _Connection.Open(); 
     _Command.ExecuteNonQuery(); 
    } 
} 

も定期的/外部接続を行うことEXTERNAL_ACCESSとしてマークされるアセンブリが必要であることに注意してください。しかし、それはないは、データベースがTRUSTWORTHY ONに設定する必要がありません:あなたは、ちょうど最後にEXTERNAL ACCESS ASSEMBLY許可ログインGRANTを非対称鍵それからログインを作成し、そのDLL /アセンブリからmasterにおける非対称鍵を作成し、アセンブリに署名し、 。

+0

UDA内のデータにアクセスすることはできません。例外:System.InvalidOperationException:このコンテキストではデータアクセスが許可されていません。 –

+0

@ T.Nguyen説明を追加するために私の答えを更新しました。 ConnectionStringに 'Enlist = false;'を追加するとうまくいきます。 –

+1

Enlist = false;完璧に動作します。ありがとうございました! –

0

は、なぜあなたは、データベース内のこれらの凝集体を保存するために(データベース操作用)C#のADO.NETを使用しないでください。これはSQL CLR関数内で行われ、データベースからSQL CLR関数を1回呼び出すと、集計がいくつかのテーブルに格納されます。

関連する問題