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