2009-07-05 4 views
2

いくつかの基準に基づいてテーブル/ビューを繰り返し、いくつかのプロセスを開始したい(ジョブの実行、電子メールの送信など)。ここSQL Server - テーブル/ビューで行単位の操作を行うための標準パターン

私の任意の制約が

は、カーソルを、このシナリオは必要ですなど、私はストアドプロシージャ、トリガにT-SQLを使用して、データベース自体の内部でこれをやりたいということである、または他のいくつかのネイティブTあり-SQLの行ベースの操作私は利用できますか?

答えて

1

あなたの最善の策はカーソルです。 SQLは宣言型であり、ベースに設定されているため、SQLに強制的に行指向の操作を行わせようとする回避策は信頼できず、中断する可能性があります。例えば。オプティマイザは実行からあなたの「操作」を切り捨てるかもしれません、または奇妙な順序でまたは予期しない回数のためにそれを行います。

一般的な悪名カーソルは、開発者が同じ機能を実行するためのセット指向の方法を見つけなかったため、セットベースの操作(計算や更新やレポートの返すなど)の代わりに展開されたときです。しかし、SQL以外の操作(つまり、プロセスを起動)では、適切です。

クライアント側で結果セットを反復処理するなど、カーソルテーマにいくつかのバリエーションを使用することもできます。これは明示的なカーソルを使用していなくても、カーソルと非常に似ています。

1

標準的な方法はSSISです。行を取得するにはSQL実行タスクを使用し、行ごとに1回ずつ反復するにはFor Eachタスクコンテナを使用します。コンテナの内部では、好きなタスクを実行し、各行の列にアクセスできます。

+0

スループットを向上させるためにジョブテーブルに対して複数の並列Ssisタスクを実行します)。私は、競合を避けるために一時的な「進行中」フラグが必要だと思います。 ssisが私のために処理できるものなのでしょうか、それとも自分自身でこのロジックを実装する必要がありますか? – Howiecamp

+0

@Howiecamp:あなたは何を意味するのか分かりません。 SQLの実行タスクは、行を含む結果セットを生成します。 For Eachタスクは1行につき1回動作します。各列が一度しか動作しないようにするには、他に何をする必要がありますか? –

0

電子メールアドレス(または同様の行ベースの操作)で各レコードに電子メールを送信する予定がある場合は、実際にカーソルを使用する予定です。

SQL自体の中で実行する他の「行ベースの」操作はありません(ただし、SQL Server StandardまたはEnterpriseを使用している限り、SSISを調査するJohnの提案は好きです)。ただし、集計、検索などの操作を行い、一度選択セット全体を終了してからイベントを開始すると、カーソルは使用されません。カーソルは、一般に、SQL Serverの問題に対する「最後の手段」のアプローチとみなされています。

+0

<<カーソルは、一般に、SQL Serverの問題に対する「最後の手段」アプローチと見なされます。 >> なぜですか? – Howiecamp

+0

一般に、カーソルを使用するとパフォーマンスが損なわれますので、できるだけ避けることが最善です。 –

+1

正しい種類の操作のためにカーソルを使用するのはまったく問題ないことに注意してください。問題は、SQLを初めて使用する人は、セット操作(ある種の基準に基づいてあるテーブルから別のテーブルにレコードのサブセットを移動するなど)を使用して実際により良いことを行うためにカーソルを使用することが多いことです。したがって、経験豊富なSQL開発者は、あなたが間違った道を始める恐れがあるので、新規参入者にそれらをお勧めすることを躊躇しています。私は、もし私が*それらを使ったことはないと言ったら、私は嘘をついただろう;-) –

0

クエリの結果セットを反復処理する必要があるときに最初に思いつくのは、カーソルを使用することです。はい、それはプログラミングの素早く汚れた方法です。しかし、カーソルにも挫折があります。オーバーヘッドが発生し、パフォーマンスボトルネックになる可能性があります。

カーソルの使用に代わる方法があります。 ID列を持つ一時表を使用してみることができます。テーブルをtempテーブルにコピーし、whileループを使用して行を繰り返し処理します。その後、ストアドプロシージャを呼び出す条件に基づいています。ここで

、カーソルの代替のために、このリンクをチェックする - どのように私は(私はいくつかの点で能力を望んでいたと仮定したら、各行のみで操作されることを保証するであろう、SSISを使用して@ジョンhttp://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1339242,00.html

歓声

+0

私はあなたが何を言っているのか分からないことを認めなければならない。結果をテンポラリテーブルにコピーする場合は、まだイテレーションを実行する必要があります。 "While"ループは、カーソルを使用して*を繰り返したり、条件を継続的にテストしたりするのに便利ですが、特定の行のデータを選択して何か(電子メールの送信など)をするのに役立ちますか? –

+0

はい、テンポラリテーブルをループするために反復処理が行われることは事実です。 SQL Server自体でも、メモリ内のテンポラリテーブルを作成してカーソルを実装しています。次に、SQL接続が閉じられるまでリソースが占有されるようなカーソルのクローズの失敗のような警告があります。 ID列の 'where'句を使用してテンポラリ・テーブルのselectクエリを使用して、特定の行のデータをテストできます。また、whileループはIDカラムの値を行カウントでチェックします。私はこれが役立つことを願っています – Arnkrishn