我有一个Azure SQL数据库,我有时想要执行临时SQL语句,这可能需要很长时间才能完成。例如,要创建索引,请从大表中删除记录或在表之间复制数据。由于涉及的数据量很大,这些操作可能需要5分钟到几个小时。
我注意到如果在SSMS中执行SQL语句,那么在执行完成之前,如果SSMS失去与服务器的连接,整个事务将自动回滚。这对于长时间运行的查询是有问题的,例如在本地wifi连接问题的情况下,或者如果我只是想关闭我的计算机离开办公室。
有没有办法指示SQL Server或SSMS执行SQL语句而不需要打开连接?我们不能使用SQL Server代理作业,因为这是一个Azure SQL数据库,如果可能的话,我们希望避免使用基于其他Azure服务的解决方案,因为这只是为了满足简单的Ad-hoc需求。
我们在SSMS中尝试了“执行后丢弃结果”选项,但是在语句完成执行之前,它仍保持打开连接:
它不是我正在寻找的异步解决方案,因为我并不真正关心执行结果(我总是可以检查查询是否仍在运行,例如使用sys.dm_exec_requests
)。换句话说,一个简单的“即发即忘”机制用于T-SQL查询。
虽然我的初始要求表明我们不想使用其他Azure服务,但我发现使用Azure Data Factory似乎是解决问题的最具成本效益和最简单的方法。此处提出的其他解决方案似乎受到高成本(虚假VM)或超时限制(Azure功能,Azure自动化Runbook)的影响,当用于此目的时,其中没有适用于ADF。
这个想法是:
由于数据工厂中没有数据移动,这个解决方案非常便宜,我使用这种方法运行了10多个小时,运行正常。
如果您可以将ad-hoc查询放在存储过程中,那么您可以在服务器上运行schedule,假设您具有必要的权限。
请注意,这可能不是一个好主意,它应该工作。
不幸的是,我认为如果没有SSMS中的开放连接,您将无法完成查询。
我可以建议以下方法: