我目前正在开发一个遗留应用程序,并继承了一些可疑的 SQL。该项目从未投入生产,但现在正在进行中。在初步测试期间,我发现了一个错误。应用程序调用一个存储过程,该存储过程调用许多其他存储过程、创建游标、循环游标以及许多其他事情。FML。
目前应用程序的设计方式是调用存储过程,然后使用一组新数据重新加载 UI。当然我们要展示的数据还在SQL server端处理,所以展示的时候UI结果是不完整的。为了解决这个问题,我在加载 UI 之前让线程休眠了 30 秒。这是一个可怕的 hack,我想在 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% 肯定。
** 附加信息:
- 执行代码在连接字符串中使用 [async=true]
- 执行代码使用 [SqlCommand].[ExecuteNonQuery] 方法