SSMS中的“消防并忘记”T-SQL查询

问题描述 投票:3回答:3

我有一个Azure SQL数据库,我有时想要执行临时SQL语句,这可能需要很长时间才能完成。例如,要创建索引,请从大表中删除记录或在表之间复制数据。由于涉及的数据量很大,这些操作可能需要5分钟到几个小时。

我注意到如果在SSMS中执行SQL语句,那么在执行完成之前,如果SSMS失去与服务器的连接,整个事务将自动回滚。这对于长时间运行的查询是有问题的,例如在本地wifi连接问题的情况下,或者如果我只是想关闭我的计算机离开办公室。

有没有办法指示SQL Server或SSMS执行SQL语句而不需要打开连接?我们不能使用SQL Server代理作业,因为这是一个Azure SQL数据库,如果可能的话,我们希望避免使用基于其他Azure服务的解决方案,因为这只是为了满足简单的Ad-hoc需求。

我们在SSMS中尝试了“执行后丢弃结果”选项,但是在语句完成执行之前,它仍保持打开连接:enter image description here

它不是我正在寻找的异步解决方案,因为我并不真正关心执行结果(我总是可以检查查询是否仍在运行,例如使用sys.dm_exec_requests)。换句话说,一个简单的“即发即忘”机制用于T-SQL查询。

sql-server tsql azure-sql-database ssms
3个回答
1
投票

虽然我的初始要求表明我们不想使用其他Azure服务,但我发现使用Azure Data Factory似乎是解决问题的最具成本效益和最简单的方法。此处提出的其他解决方案似乎受到高成本(虚假VM)或超时限制(Azure功能,Azure自动化Runbook)的影响,当用于此目的时,其中没有适用于ADF。

这个想法是:

  1. 将长时间运行的SQL语句放入存储过程中
  2. 使用“存储过程”活动创建数据工厂管道以在数据库上执行SP。确保将活动的超时和重试值设置为合理值。
  3. 触发管道

由于数据工厂中没有数据移动,这个解决方案非常便宜,我使用这种方法运行了10多个小时,运行正常。


0
投票

如果您可以将ad-hoc查询放在存储过程中,那么您可以在服务器上运行schedule,假设您具有必要的权限。

请注意,这可能不是一个好主意,它应该工作。


0
投票

不幸的是,我认为如果没有SSMS中的开放连接,您将无法完成查询。

我可以建议以下方法:

  1. 将查询传递到azure函数/ AWS Lambda以代表您执行(可能通过休息将其作为服务公开)并将其存储或发送到可访问的位置。
  2. 在云中启动VM并通过RDP从VM运行查询。准备好后,重新建立与VM的RDP连接,您将能够查看查询的结果。
  3. 使用Azure自动化Runbook在计划的触发器上执行查询。
© www.soinside.com 2019 - 2024. All rights reserved.