2011-01-04 14 views
3

非常にばかげた例ですが、注文テーブルから最大注文IDを取得する必要がある場合、2つのオプションがあります。しかし、私はこれらの2つだけに興味があります)。私はオーバーヘッドが少なくなることを知ることに興味があります。ストアドプロシージャの値を出力パラメータとして返すSELECTステートメント

単に値を選択する最初のもの:

CREATE PROCEDURE GetLastOrderID 
AS 
SELECT Max(OrderID) FROM Orders 

した後、PROCを実行.ExecuteScalarを呼び出し、intに値をキャストするSqlCommandオブジェクトを作成するために、C#コードに対応します。

出力パラメータ

CREATE PROCEDURE GetLastOrderID (@MaxOrderID INT OUTPUT) 
AS 
SET @MaxOrderId = Max(OrderID) FROM Orders 

として値を通過し、第1、次いで、その呼.ExecuteNonQueryを、PROCを実行int型の出力パラメータを追加するために、SqlCommandオブジェクトを作成するために、C#コードに対応します、最後に出力パラメータの値を取得します。

本当に他のものよりも利点がありますか?私の気持ちは、明示的な型は与えられていないので、最初のオプションはより多くの時間とリソースを必要とするだろうということですが、確かな答えがあるかどうかを知りたいのです。 (権限の面で私の「腸の感触」を打つか、少なくとも一つ)

+0

「OPUTPUT」パラメータは、レコードセットの作成および返すよりもはるかに軽量であることを意味します。私はどれくらい考えてもわかりません。 2つのバージョンを作成してループで呼び出すことで、これを簡単にテストすることができます。 –

+0

@Martin:彼らは軽いですが、何度も呼び出さなければ、その差は小さくなります。 –

答えて

3

あなたが参照しているのオーバーヘッドは、実際以外のものにTSQL MAX()ステートメントを実行しているに比べてごくわずかです些細な数の行。

最も理解しやすくメンテナンス可能なフォームを使用してください。

パフォーマンスの問題を特定した場合は、パフォーマンスが心配です。

+0

念頭におくと、これは「ばかげた」例でした。あなたは本当に質問に答えていない、ちょうどこの特定の例は無視できるので、それは問題ではないと言いました。より良い例は、テーブルに値を挿入し、新しい行のIDを取得することでしょうか? –

+0

@Paul Sainsbury:例を尋ねる人だけがこの例を制御できます! ;) –

+0

@Paul:私は愚かな例ではありません。私は自分自身で質問したかったと思う。 – Sung

1

出力パラメータは軽量です。

関連する問題