В настоящее время я работаю над унаследованным приложением и унаследовал с ним несколько теневых SQL. Проект никогда не был запущен в производство, но сейчас он в процессе. Во время первоначального тестирования я обнаружил ошибку. Приложение вызывает хранимую процедуру, которая вызывает много других хранимых процедур, создает курсоры, проходит через курсоры и многое другое. FML.
В настоящее время способ, которым разработано приложение, вызывает хранимую процедуру, а затем перезагружает интерфейс со свежим набором данных. Конечно, данные, которые мы хотим отобразить, все еще обрабатываются на стороне сервера SQL, поэтому результаты пользовательского интерфейса не отображаются полностью. Чтобы это исправить, я просто заставил поток спать в течение 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, до того, как курсоры в вызовах ветвления завершены, стоит ли преобразовывать эти хранимые процедуры в функции с возвращаемыми значениями? Вынудит ли это SQL ждать перед завершением основного вызова хранимой процедуры [ALLOCATED_BUDGET]?
- Последний вызов оператора SQL в хранимой процедуре устанавливает состояние «Выделено». Это происходит до завершения обработки курсоров в предыдущих вызовах. Влияет ли выполнение этих вызовов на вызовы функций, как хранимая процедура возвращает фокус приложению?
Любая обратная связь с благодарностью. У меня такое чувство, что я правильно отношусь к функциям SQL, но не уверен на 100%.
** дополнительная информация:
- Выполнение кода использует [async = true] в строке подключения
- Для выполнения кода используется метод [SqlCommand]. [ExecuteNonQuery]