2011-01-02 134 views
1

SQLCLRトリガーがあります。それはのような部品で、内部の大規模かつ厄介なSELECTが含まれていますSELECTをSQL Server側に移動

(CASE WHEN EXISTS(SELECT * FROM INSERTED I WHERE I.ID = R.ID) 
THEN '1' ELSE '0' END) AS IsUpdated -- Is selected row just added? 

だけでなく、私がすべて含まれた単一のテーブルとして結果を持ちたいなどに参加します。

質問1。このSELECTをSQL Server側に移動できますか?はいの場合、これを行う方法は?

「移動」とは、サイクル中にデータセットを読み込む前に実行できるストアドプロシージャなどを作成することです。

次の2つの質問は、回答が「はい」の場合にのみ意味があります。

なぜSELECTを移動したいですか?まず、SQLとC#コードを混在させるのは嫌いです。第二に、サーバー側でクエリをキャッシュするチャンスが増えているため、サーバー側のクエリがより高速に実行されると思います。

質問2。私は正しい?それはある種の最適化ですか?

また、SELECTには定数文字列が含まれていますが、それらはローカライズ可能です。 OnCreateイベントおよびOnDestroy - - その後、ストアドプロシージャとしてマークたとえば、だから、ドイツ語、フランス語などのために変更する必要があります「有効」

WHERE R.Status = "Enabled" 

は、私は2つの静的メソッドを書きたいです。サーバーサイドでアセンブリを登録/登録解除するときは、それぞれ呼び出すだけです。 OnCreateでは、{0}、{1} ...をアセンブリリソースからの必要な値に置き換えて、SELECT文字列をフォーマットします。その後、すべてのスクリプトではなく、リソースのみをローカライズできます。

質問3。いいアイデアですか?アセンブリを登録した後に自動的にSQL Serverによって実行されるメソッドをマークする既存の属性はありますか?

よろしく、

答えて

1

まあ、SQL-CLRトリガは、サーバー・プロセスの内部で、サーバー上を実行しません - それは同様に、サーバー側ですので、そこに何のメリットを。

しかし、私は同意する - トリガは、可能な限りT-SQLで書かれるべきである - C#でトリガを持つことに本当に大きな利点はない....あなたは全体のトリガコードを表示できますか?本当に奇妙なボールが入っていない限り、T-SQLに変換するのは簡単です。

SELECTをSQL側に「移動」させ、残りのコードをC#で保持する方法がわかりません - トリガーがT-SQL(自分の設定)にあるか、それともC#/SQL-CLR - "ミックスとマッチ"の方法はないと思います。

+0

残念ながら、それは複数のCOMサーバーを使用するため、純粋なT-SQLでの変換はオプションではありません。 – noober

+0

@noober:sp_OACreateを使用して、T-SQL内からCOMのものをインスタンス化して使用することができます。 –

+0

sp_OACreateの使用には注意が必要です。 sp_OA関数を使用することから「メモリ不足」を除いた問題がありました。これはSQL Server 2005のSP3で修正されたと思われますが、修正されていないため、削除する必要がありました。 sp_OA *の参照が削除されて以来、何の問題もありませんでした。 –

1

まず、実行しているクエリの中でそのタイプのサブクエリを実行する必要はありません。 INSERTEDテーブルには、更新された(または挿入された行のみがありますが、これはコード内のコメントに基づいてUPDATE Triggerとみなされます)。したがって、INNER JOINとTABLEの行を "R"の別名で一致させるか、LEFT JOINを実行すると、Rのどの行が更新されたかを知ることができます。

質問1)以下のようにmarc_sが述べるように、トリガーはデータベースのコンテキストで実行されます。しかしそれはそれを超えています。 SQLCLRを含むすべてのデータベース関連のコードがデータベースで実行されます。ここにはクライアントサイドはありません。これは、ほとんどの人がSQLCLRに持つ問題です。SQL Serverコンテキスト内で実行されます。また、TriggerからStored Procを呼びたい場合は、実行できますが、INSERTEDおよびDELETEDテーブルはTrigger自体のコンテキスト内にのみ存在します。

質問2)この質問は「また、SELECT」という言葉から始まっているはずです。ここでは2つのことを考慮する必要があります。まず、 "Status"値(またはLookup値)をテストするときは、ユーザーに表示されないため、数値を使用する必要があります。 「有効」の「ステータス」は、言語が適切でないように「1」のようなものでなければならない。副次的な利点は、ステータス値を数値として保存するだけでなく、スペースを大幅に少なくすることができるということです。第2に、言語の違いに敏感である必要のあるユーザーに表示されるテキストは、LanguageIdまたはLocaleIdを渡して適切なフランス語、ドイツ語などの文字列を表示できるようにする必要があります。ユーザーまたはシステムのLocaleIdは一般に別のテーブルに設定できます。

質問3)「登録」によってアセンブリが作成または削除されている場合は、DDLトリガーを使用してそれらのイベントをトラップできます。あなたは、いくつかの基本はここを見ることができます:

http://msdn.microsoft.com/en-us/library/ms175941(v=SQL.90).aspx

しかし、アセンブリを作成し、DROP ASSEMBLYはトラップ可能であるイベントです。

アセンブリーがメモリーからロードされ、アンロードされているときは、それをトラップする方法がわかりません。

関連する問題