私は、動的SQLを使用するいくつかのストアドプロシージャを持っています。 エラー処理のためにトラブルシューティングや変更が非常に煩わしくなる可能性があるため、動的ではないように変更したいと思います(エラーメッセージをクリックしてもエラーにはなりません)。私はテキストを選択してこれを手助けするために通常のSQLとして貼り付けることができますが、かなりイライラしています。動的SQLの代替
私がこれに抱えている問題は、動的ではない場合、クエリがより遅く実行されることです。具体的には、where句は、柔軟性の向上により動的クエリではるかに高速です。句は次のようになりどこ
where
SomeColumn = case when @variable1 = 0 then SomeColumn else @variable1 end
and(
(@variable2 = -2 and SomeColumn2 = 1)
or (@variable2 = -1)
or (@variable2 = 0 and SomeColumn2 = 0 and SomeColumn3 = 0)
or (@variable2 = 1 and SomeColumn2 = 0 and SomeColumn3 > 0)
)
しかし、動的:このような場合ステートメントを使用して
where ' + @SomeCondition + @SomeCondition2 + '
:
declare @SomeCondition nvarchar(max) = case
when @variable3 = -2 then N'Condition 1'
when @variable3 = 0 then N'Condition 2'
when @variable3 = 1 then N'Condition 3'
else N''
end
のみたとえば、静的な句は次のようなものになるだろう場所私が考えることができるのは複数のif
ステートメントを使用しており、各ステートメントのwhere句のみを変更することですが、これは非常に無駄で時間がかかるようです。
その他の動的SQLの代替方法はありますか? これは失敗しました。SQL Serverにエラーを正しく伝えるためにできることはありますか?
動的SQLに起因するエラーを取得するために 'try' /' catch'を使用していますか?エラー処理を修正することで、必要な処理が行われる可能性があります。あなたが 'recompile'オプションを使わなければ、複数の' if'でも問題になることがあります。 –
これは非常に役に立ちます。不満足なエラー処理は、私が動的クエリを変更する唯一の理由です。私はちょうどSQLを含む変数内でtry/catchを使用するか、それを外部に書き出す必要がありますか?私は、動的SQLを使ってそれをどうやってどうやって進めるかについては完全にはわかりません –
専門的で最適化された手順を作成し、パラメータに基づいて適切な手順を呼び出すことで、OR条件を避けることができます。しかし、あなたは維持するためのより多くの手続きを持っています。私の経験では、ダイナミックなクエリや特殊なクエリだけでなく、機能するための「ワンサイズ・オール・オール」クエリ(ここではor-or-or-orパターン)は決して得られません。 –