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

时间:2018-02-09 08:25:59

标签: sql-server tsql azure-sql-database ssms

我有一个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查询。

3 个答案:

答案 0 :(得分:1)

虽然我的最初要求表明我们不想使用其他Azure服务,但我发现使用Azure Data Factory似乎是解决问题的最经济高效且最简单的方法。此处提出的其他解决方案似乎都遭受了高昂的成本(启动虚拟机)或超时限制(Azure函数,Azure自动化运行手册)的困扰,当用于此目的时,这些限制均不适用于ADF。

想法是:

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

由于在Data Factory中没有进行任何数据移动,因此该解决方案非常便宜,而且我使用这种方法运行了10多个小时的查询,效果很好。

答案 1 :(得分:0)

如果您可以在存储过程中放置​​即席查询,则可以schedule在服务器上运行,假设您具有必要的权限。

请注意,这可能不是一个好主意,但应该有效。

答案 2 :(得分:0)

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

我可以建议以下方法:

  1. 将查询传递到azure函数/ AWS Lambda中以代表您执行(也许通过休息将其公开为服务),然后将其存储或发送结果到可访问的地方。
  2. 在云中启动VM,然后通过RDP从VM运行查询。准备就绪后,您可以重新建立与VM的RDP连接,您将能够查看查询结果。
  3. 使用Azure自动化运行手册在计划的触发器上执行查询。