2011-10-25 2 views
0

与えられたIDについて、私はDBテーブルからレコードを選択したいと思います。 レコードが存在しない場合は、いくつかのデフォルト値を挿入してレコードを返したいと思います。tsqlを挿入して選択する効率的な方法は何ですか?

どうすればよいですか? 私の問題は、挿入してから選択することです。それは非効率的だと思われる。

+3

[出力節](http://msdn.microsoft.com/en-us/library/ms177564.aspx)のようなデータベースを使用していると、SQLサーバーで動作する可能性があります – V4Vendetta

+1

時間の何パーセントですかすでにレコードがあると思いますか? –

+0

それは*あると思われますか、それともあなたはそれを証明しましたか? –

答えて

0

レコードが存在せず、レコードを作成する必要がある場合は、その選択肢はあまりありません。例外として、問題の表にID列がないか、計算列があり、その中に入れるものは基本的にすべてのものです。次に、挿入する可能性がありますし、あなたが初期設定したオブジェクトをデフォルト値から返します。

しかし、データベース挿入が(トリガーを含む)ID列を使用している場合は、挿入後にデータを選択する以外に多くのことを行うことはできません。

2

私は「NOT EXISTS」の状態で、挿入を試み、その後、間違いなくその時点*に存在する私たちが知っている行を選択します:これは、それが常に返すという利点を有する

INSERT INTO <Table> (<Columns>) 
SELECT <Column Values> WHERE NOT EXISTS(SELECT * FROM <Table> WHERE <Key Column Match Conditions>) 

SELECT <Select Columns Needed> FROM <Table> WHERE <Key Column Match Conditions> 

何らかの解決策(例えば、OUTPUTとSELECTを使用したINSERT)は複数の結果セットを生成しますが、これは出力を消費するものではうまく機能しない可能性があります。


*あなたは可能性を秘めたレースでもでない限りは、テーブルから削除されます - しかし、あなたはまだこの可能性を言及していないので、削除がすぐに発生した場合、我々は、所望の出力がどうなるか分かりません挿入後

+0

+1、私は著者がこの回答を受け入れ、私のものではないと思う。私はINSERT..INTO ... SELECTパラダイムを完全に忘れていました。 –

関連する問題