AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 34947
Accepted
Rachel
Rachel
Asked: 2013-02-19 05:50:00 +0800 CST2013-02-19 05:50:00 +0800 CST 2013-02-19 05:50:00 +0800 CST

我可以启动一个存储过程并立即返回而不等待它完成吗?

  • 772

我们有一个存储过程,用户可以手动运行该存储过程,以获取全天不断使用的报告的一些更新数字。

我有第二个存储过程应该在第一个存储过程运行之后运行,因为它基于从第一个存储过程获得的数字,但是它需要更长的时间运行并且是一个单独的进程,所以我不想在第二个存储过程运行时让用户等待。

有没有办法让一个存储过程启动第二个存储过程,并立即返回而不等待结果?

我正在使用 SQL Server 2005。

sql-server sql-server-2005
  • 5 5 个回答
  • 66271 Views

5 个回答

  • Voted
  1. Best Answer
    Rachel
    2013-02-19T07:06:58+08:002013-02-19T07:06:58+08:00

    看起来有多种方法可以实现这一点,但我发现最简单的方法是Martin 建议在 SQL 作业中设置过程,并使用我的存储过程中的异步sp_start_job命令启动它。

    EXEC msdb.dbo.sp_start_job @job_name='Run2ndStoredProcedure'
    

    这仅适用于我,因为我不需要为我的存储过程指定任何参数。

    其他可能会根据您的情况起作用的建议是

    • 使用Martin和Sebastian建议的SQL Service Broker 。如果您不介意设置和了解其工作原理的复杂性,这可能是最好的建议。

    • 在负责执行存储过程的代码中异步运行该过程,就像Mr.Brownstone 建议的那样。

      不错的主意,但是在我的情况下,存储过程是从多个地方调用的,因此找到所有这些地方并确保它们也调用第二个过程似乎并不实用。此外,第二个存储过程非常关键,忘记运行它可能会给我们公司带来一些重大问题。

    • 让第一个过程设置一个标志,并设置一个重复的作业来检查该标志并在其设置时运行,就像Jimbo 建议的那样。我不喜欢持续运行并每隔几分钟检查一次更改的工作,但根据您的情况,这当然是一个值得考虑的选项。

    • 30
  2. BradC
    2017-06-17T08:49:15+08:002017-06-17T08:49:15+08:00

    这个老问题值得更全面的回答。其中一些在此处的其他答案/评论中提到,其他可能适用于 OP 的特定情况,也可能不适用,但可能适用于其他寻找从 SQL 异步调用存储过程的人。

    完全明确地说:TSQL(本身)不具备异步启动其他 TSQL 操作的能力。

    这并不意味着您仍然没有很多选择:

    • SQL 代理作业:创建多个 SQL 作业,并安排它们在所需的时间运行,或者使用sp_start_job. 如果您需要以编程方式监控它们的进度,只需确保每个作业都更新自定义 JOB_PROGRESS 表(或者您可以使用Gregory A. Larsen的这篇优秀文章xp_sqlagent_enum_jobs中描述的未记录函数检查它们是否已完成)。您必须创建与运行并行进程一样多的单独作业,即使它们正在运行具有不同参数的相同存储过程。
    • SSIS 包:对于更复杂的异步方案,使用简单的分支任务流创建一个 SSIS 包。SSIS 将在单独的 spid 中启动这些任务,SQL 将并行执行这些任务。从 SQL 代理作业调用 SSIS 包。
    • 自定义应用程序:使用您选择的语言(C#、Powershell 等),使用该语言提供的异步方法编写一个简单的自定义应用程序。在每个应用程序线程上调用 SQL 存储过程。
    • OLE 自动化:在 SQL 中,使用sp_oacreate和sp_oamethod启动一个新进程来调用彼此的存储过程,如本文所述,同样由 Gregory A. Larsen 撰写。
    • Service Broker:研究使用Service Broker ,这是本文中异步执行的一个很好的例子。
    • CLR 并行执行:使用 CLR 命令Parallel_AddSql,Parallel_Execute如Alan Kaplan的这篇文章中所述(仅限 SQL2005+)。
    • 计划的 Windows 任务:为了完整性而列出,但我不喜欢这个选项。

    如果是我,我可能会在更简单的场景中使用多个 SQL 代理作业,在更复杂的场景中使用 SSIS 包。

    在您的情况下,调用 SQL 代理作业听起来像是一个简单且易于管理的选择。

    最后一条评论:SQL 已经尽可能地尝试并行化各个操作*。这意味着同时运行 2 个任务而不是一个接一个地运行并不能保证它会更快完成。仔细测试,看看它是否真的改善了任何东西。

    我们有一个开发人员创建了一个 DTS 包来同时运行 8 个任务。不幸的是,它只是一个 4-CPU 服务器 :)

    *假设默认设置。这可以通过更改服务器的最大并行度或亲和掩码,或使用 MAXDOP 查询提示来修改。

    • 10
  3. Sebastian Meine
    2013-02-19T06:57:13+08:002013-02-19T06:57:13+08:00

    您可以将服务代理与队列上的激活一起使用。有了它,您可以在队列上发布过程调用的参数。这需要与插入一样多的时间。在事务提交后可能还有几秒钟,激活将自动异步调用接收器过程。它不仅仅是 wuold 必须获取队列的参数并完成所需的工作。

    • 8
  4. Jimbo
    2013-02-19T06:03:22+08:002013-02-19T06:03:22+08:00

    是的,一种方法:

    1. 当第一个存储过程完成时,它会插入一条记录,其中包含第二个存储过程运行所需的所有信息
    2. 第二个存储过程作为作业运行,每分钟或您决定的时间
    3. 它检查插入的记录,执行其处理并将记录标记为完整
    • 6
  5. paco
    2013-02-19T13:22:00+08:002013-02-19T13:22:00+08:00

    另一种可能性是让第一个存储过程在完成时写入审计表,并在审计表上放置一个触发器,在写入审计表时启动第二个存储过程。无需连续轮询,也无需额外的 SQL Server 代理作业。

    • 1

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve