ストアドプロシージャ内では、アイテムのテーブル(#Items)を設定します。それらに関する基本的な情報しかし、それぞれの商品について、私はそれらを販売することができることを確認する必要があります。そのためには、多くのバリデーションを実行する必要があります。ストアドプロシージャをいくらか保守可能にするために、私はそのロジックを別のストアドプロシージャに移しました。このSQLロジックを処理するにはどうすればよいでしょうか?
一時テーブルの各アイテムのストアドプロシージャを呼び出すにはどうすればよいでしょうか?
私は今、ID列を適用し、whileループを実行して、各行のストアドプロシージャを実行し、検証結果を一時テーブルに挿入します。 (#Validation)
しかし、今度はロジックが変更され、#Itemの作成とループの実行の間に、IDがもはやカウンタに等しくないため、whileループを壊すレコードが削除されます。
アイデンティティ列を削除してwhileループの前にそれを適用することでそれを処理できますが、より良い方法があるかどうかは疑問でした。 order by節を適用すると、インデックスに特定の行を取得する方法はありますか?
私はカーソルを使うことができると知っていますが、それらは私にとっては痛みです。また、パフォーマンスはいくらか懸念されますが、早送りの読み込みカーソルはwhileループよりも優れたオプションですか? #Itemsテーブルの行数はそれほど大きくなく、おそらく最大で50ですが、ストアドプロシージャはかなり頻繁に呼び出されます。
ありがとう、これは素晴らしい動作するはずです。私はユーザー定義関数に慣れていませんが、これはコストパフォーマンスの高い賢明なものになるでしょうか? – Brandon
アイテムを手作業でループする以上のことはありません。通常、すべてのロジックをwhere句に入れることでそれを改善できますが、それは読み込み/保守がさらに難しくなります。この場合、一時テーブルにはおそらくインデックスがないため、あまり役に立ちません。 –
ユーザ定義関数はsprocsと非常によく似ていますが、いくつかの異なる制限/機能があります。 OKを実行する必要があります(ループよりもはるかに優れたセットベース)。実行計画がキャッシュ/再利用されていることから利益を得ます。 – AdaTheDev