0

現在、有効な都市と州の値を取得する呼び出し元アプリケーションを提供するストアド プロシージャを作成しています。
zip_code を指定すると、ストアド プロシージャは、指定された入力パラメーターのすべての有効な都市/州の組み合わせのリストを返します。
ただし、zip_code が存在しない場合、ストアド プロシージャはエラー文字列「ZipCode Wrong!」を返す必要があります。空のデータセットではなく、呼び出し元のアプリケーションに戻ります。
私は2つのアプローチを検討しました:

最初のアプローチ

SELECT City, State FROM ZipCodeTable WHERE Zip = @ZipCode
IF (@@ROWCOUNT = 0)
return 'ZipCode Wrong!'

第二のアプローチ

SELECT COALESCE(  
               (SELECT City, State FROM ZipCodeTable WHERE Zip=@ZipCode FOR XML PATH ('')),
               (SELECT 'ZipCode Wrong!') FOR XML PATH (''))

このトランザクションは毎秒何回も実行されるため、できるだけ効率的にしたいと考えています。パフォーマンスの観点から、どちらがより効率的ですか? また、別のより良いアプローチがあれば、遠慮なく教えてください。ありがとう!

4

4 に答える 4

1

1 つは結果をカウントし、もう 1 つはセットを返すため、aCOUNTを使用せず、a も使用しない場合があります。SELECT

あなたは本当にそれが存在するかどうかを尋ねるつもりです...だから、その目的のために意図された句を使用しないのはなぜですか?

EXISTS
http://msdn.microsoft.com/en-us/library/ms188336.aspx

代わりに、結果が存在する場合は結果を返し、存在しない場合はエラーメッセージを返したい場合は、@@ROWCOUNTおそらくより高速です... プロファイラーを使用してベンチマークする必要があります。

ただし、ユースケースを検討してください。大幅に多くのエラーと有効な返品が予想されますか? もしそうなら、おそらくEXISTS構文はフィルターとして優れています...より有効な戻り値が期待される場合は、SELECTwith@@ROWCOUNTが好まれるかもしれません。

これについては、答えはかなり率直です

どのデータベースを使用していますか? おそらく、これには実装固有のアプローチがあります。

于 2012-06-29T18:40:24.743 に答える
0

これはアプリケーション層で処理する必要があると思います。返された行数を見て、その方法でエラーを検出します。SQL ソリューションよりもはるかに速く、簡単で、クリーンです。

于 2012-06-29T18:39:50.143 に答える
0

IF Then 分岐は一般に時間がかかります。COALESCE の方がプロセッサの最適化が容易です。

とはいえ、おそらく同じ速度で実行されるので、両方のソリューションをスピードテストします。

于 2012-06-29T18:27:27.283 に答える
0

必要がない場合は結果全体を作成しないでください。カウントするだけです。

declare @cnt int
select @cnt = count(*) from ZipCodeTable where Zip = @ZipCode
if (@cnt) begin
  return 'ZipCode Wrong!'
end
于 2012-06-29T18:31:12.940 に答える