我目前正在开发一个遗留应用程序,并继承了一些可疑的SQL。这个项目从未投入生产,但现在正在进行中。在初步测试中我发现了一个窃听器。应用程序调用一个存储过程,该存储过程调用许多其他存储过程,创建游标,通过游标循环以及许多其他事情。FML。
目前,应用程序的设计方式是调用存储过程,然后用一组新的数据重新加载UI。当然,我们想要显示的数据仍在SQL服务器端进行处理,因此UI结果在显示时不完整。为了解决这个问题,我只是在加载UI之前,让线程休眠了30秒。这是一次可怕的黑客攻击,我想在SQL方面正确地解决这个问题。
我的问题is...is是否值得将分支存储过程转换为函数?这会使主线存储过程在开始处理之前等待返回值吗?
以下是存储过程:
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函数是正确的,但不是100%肯定。
**补充资料:
发布于 2009-07-20 17:24:38
你是怎么叫这个程序的?我猜您正在使用ExecuteNonQuery()来调用这个过程。尝试使用ExecuteScalar()调用该过程并修改该过程,如下所示:
ALTER PROCEDURE [dbo].[ALLOCATE_BUDGET]
@budget_scenario_id uniqueidentifier
AS
BEGIN
...
RETURN True
END这将导致.NET中的数据执行代码在继续之前等待过程完成。如果您不希望您的UI在过程执行过程中“挂起”,请使用BackgroundWorkerProcess或类似的东西在单独的线程上运行查询,并查找已完成的回调以使用结果更新UI。
发布于 2009-07-20 17:22:02
您还可以尝试在子存储过程中使用返回语句,该存储过程可用于将结果代码返回给父过程。您可以按照"exec @myresultcode = BUDGET_ALLOCATE_SCENARIO_REGIONBYREGION()“这样的方式调用子过程。我认为这应该迫使父过程等待子过程完成。
发布于 2009-07-20 17:35:30
我从未听说过存储过程有可能在后台执行时返回给调用方。
事实上,我甚至会说我不相信会发生这种事。如果您看到UI和您认为SP应该做的事情之间的差异,那么我相信它有一个不同的原因。
连接字符串中有async=true吗?SP是通过使用BeginExecuteReader或Begin来执行的吗?
https://stackoverflow.com/questions/1154729
复制相似问题