私は現在、レガシーアプリケーションに取り組んでおり、怪しげな SQL を継承しています。このプロジェクトはまだ生産されていませんが、現在進行中です。最初のテスト中に、バグが見つかりました。アプリケーションは、他の多くのストアド プロシージャを呼び出すストアド プロシージャを呼び出し、カーソルを作成し、カーソルをループ処理し、その他多くのことを行います。FML。
現在のアプリの設計方法では、ストアド プロシージャを呼び出してから、新しいデータ セットで UI を再読み込みします。もちろん、表示したいデータはまだ SQL サーバー側で処理されているため、UI の結果は表示された時点では完全ではありません。これを修正するために、UI をロードする前にスレッドを 30 秒間スリープさせました。これはひどいハックであり、SQL 側でこれを適切に修正したいと考えています。
私の質問は...分岐ストアド プロシージャを関数に変換する価値はありますか? これにより、メインラインのストアド プロシージャは、処理を行う前に戻り値を待機するようになりますか?
ストアド プロシージャは次のとおりです。
ALTER PROCEDURE [dbo].[ALLOCATE_BUDGET]
@budget_scenario_id uniqueidentifier
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @constraint_type varchar(25)
-- get project cache id and constraint type
SELECT @constraint_type = CONSTRAINT_TYPE
FROM BUDGET_SCENARIO WHERE BUDGET_SCENARIO_ID = @budget_scenario_id
-- constraint type is Region by Region
IF (@constraint_type = 'Region by Region')
EXEC BUDGET_ALLOCATE_SCENARIO_REGIONBYREGION @budget_scenario_id
-- constraint type is City Wide
IF (@constraint_type = 'City Wide')
EXEC BUDGET_ALLOCATE_SCENARIO_CITYWIDE @budget_scenario_id
-- constraint type is Do Nothing
IF (@constraint_type = 'Do Nothing')
EXEC BUDGET_ALLOCATE_SCENARIO_DONOTHING @budget_scenario_id
-- constraint type is Unconstrained
IF (@constraint_type = 'Unconstrained')
EXEC BUDGET_ALLOCATE_SCENARIO_UNCONSTRAINED @budget_scenario_id
--set budget scenario status to "Allocated", so reporting tabs in the application are populated
EXEC BUDGET_UPDATE_SCENARIO_STATUS @budget_scenario_id, 'Allocated'
END
呼び出し元の .NET アプリケーション UI に不完全な結果セットが表示されないようにするために、分岐呼び出しのカーソルが完了する前に、これらのストアド プロシージャを戻り値を持つ関数に変換する価値はありますか? これにより、[ALLOCATED_BUDGET] ストアド プロシージャへのメイン コールが完了する前に SQL が待機することになりますか?
- ストアド プロシージャ内の最後の SQL ステートメント呼び出しにより、ステータスが "割り当て済み" に設定されます。これは、前の呼び出しのカーソルの処理が完了する前に発生しています。これらの呼び出しを関数呼び出しにすると、ストアド プロシージャがアプリケーションにフォーカスを返す方法に影響しますか?
フィードバックは大歓迎です。SQL 関数を使用することは正しいと思いますが、100% 確実ではありません。
** 追加情報:
- コードを実行すると、接続文字列で [async=true] が使用されます
- コードの実行は [SqlCommand].[ExecuteNonQuery] メソッドを使用します