私はプロジェクト用にColdFusionを使用していますが、ストアドプロシージャを使用する方が高速かもしれないと書かれていますが、私はT-SQLの人ではありません私はそれを比較する方法をよく分かりません。ストアドプロシージャ/ ColdFusionのSelectクエリに基づくテーブルの更新
動的に構築されたcfqueryに基づいてテーブルからいくつかのフィールドを選択する初期クエリを実行しています。私はこのクエリをSQL Serverストアドプロシージャに変換する方法を知っていると思います。
しかし、その直後に、私はそのクエリからすべてのプライマリキーIDを取得し、別のテーブルに対してこれらのIDを持つレコードを「ロック」する別のクエリを実行します。ロックは、このレコードが「チェックアウトされた」ことをシステムに知らせる、第2のテーブル内のビットフィールド(フラグ)である。私はcftransaction
の両方のクエリをラップして、1つの単位として実行します。
コード概要:
<cftransaction>
<cfquery name="selectQuery">
SELECT id, field2, field3
FROM table1
WHERE (bunch of conditions here)
</cfquery>
<cfquery name="updateQuery">
UPDATE table2
SET lockField = 1
WHERE table2.id IN (#ValueList(selectQuery.id#)
</cfquery>
</cftransaction>
私はその後、いくつかのデータを出力するためにそれを使用しています私のアプリにselectQueryの結果セットを返します。 cfstoredproc
を使用して呼び出すことができる単一のSQL Server 2008ストアドプロシージャで同じことをどのように達成できますか?
また、CFに戻り、DBに戻って別のクエリを呼び出す必要があるため、ネイティブCFウェイ(cfquery
)はストアドプロシージャほど効率的ではないと考えています。 1つのストアドプロシージャがDB内のすべての処理を行い、使用するために元のクエリ結果セットを返します。
アイデア?
いいえ、私はこの回答の健全性チェックが必要です。テーブル1のデータは一定のフラックスにあります...本質的にキューです。これは単一のstoredprocの内部にあるので、本質的に単一のトランザクション権限として実行されていますか?意味、私はテーブル1で2回SELECTを実行しているので、私は両方の時間に同じ結果を得ていることを保証する必要があります。多くのユーザーがこの機能を定期的に使用するため、「ロック」が正しく機能するようにする必要があります。 –
いいえ、単一のトランザクションとして実行されていません。更新プログラムを実行する前にデータを出力する必要がある場合は、別の方法で行う必要があります。私はあなたの質問の全体をロックするものをキャッチしていない。 –