首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL用户定义函数与存储过程分支

SQL用户定义函数与存储过程分支
EN

Stack Overflow用户
提问于 2009-07-20 17:09:55
回答 6查看 1.2K关注 0票数 1

我目前正在开发一个遗留应用程序,并继承了一些可疑的SQL。这个项目从未投入生产,但现在正在进行中。在初步测试中我发现了一个窃听器。应用程序调用一个存储过程,该存储过程调用许多其他存储过程,创建游标,通过游标循环以及许多其他事情。FML。

目前,应用程序的设计方式是调用存储过程,然后用一组新的数据重新加载UI。当然,我们想要显示的数据仍在SQL服务器端进行处理,因此UI结果在显示时不完整。为了解决这个问题,我只是在加载UI之前,让线程休眠了30秒。这是一次可怕的黑客攻击,我想在SQL方面正确地解决这个问题。

我的问题is...is是否值得将分支存储过程转换为函数?这会使主线存储过程在开始处理之前等待返回值吗?

以下是存储过程:

代码语言:javascript
复制
    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%肯定。

**补充资料:

  1. 在连接字符串中,执行代码使用async=true。
  2. 执行代码使用SqlCommand.ExecuteNonQuery方法
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-20 17:24:38

你是怎么叫这个程序的?我猜您正在使用ExecuteNonQuery()来调用这个过程。尝试使用ExecuteScalar()调用该过程并修改该过程,如下所示:

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[ALLOCATE_BUDGET] 
    @budget_scenario_id uniqueidentifier
AS
BEGIN
   ...

    RETURN True
END

这将导致.NET中的数据执行代码在继续之前等待过程完成。如果您不希望您的UI在过程执行过程中“挂起”,请使用BackgroundWorkerProcess或类似的东西在单独的线程上运行查询,并查找已完成的回调以使用结果更新UI。

票数 2
EN

Stack Overflow用户

发布于 2009-07-20 17:22:02

您还可以尝试在子存储过程中使用返回语句,该存储过程可用于将结果代码返回给父过程。您可以按照"exec @myresultcode = BUDGET_ALLOCATE_SCENARIO_REGIONBYREGION()“这样的方式调用子过程。我认为这应该迫使父过程等待子过程完成。

票数 2
EN

Stack Overflow用户

发布于 2009-07-20 17:35:30

我从未听说过存储过程有可能在后台执行时返回给调用方。

事实上,我甚至会说我不相信会发生这种事。如果您看到UI和您认为SP应该做的事情之间的差异,那么我相信它有一个不同的原因。

连接字符串中有async=true吗?SP是通过使用BeginExecuteReader或Begin来执行的吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1154729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档