В настоящее время я работаю над устаревшим приложением и унаследовал от него некоторый теневой SQL. Проект так и не был запущен в производство, но сейчас он в пути. Во время начального тестирования я обнаружил ошибку. Приложение вызывает хранимую процедуру, которая вызывает множество других хранимых процедур, создает курсоры, перебирает курсоры в цикле и многое другое. ФМЛ.
В настоящее время приложение спроектировано таким образом, что оно вызывает хранимую процедуру, а затем перезагружает пользовательский интерфейс с новым набором данных. Конечно, данные, которые мы хотим отобразить, все еще обрабатываются на стороне 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].