【发布时间】:2018-07-19 23:18:18
【问题描述】:
我有一个 Azure SQL 数据库,有时我想在其中执行临时 SQL 语句,这可能需要很长时间才能完成。例如创建索引、从大表中删除记录或在表之间复制数据。由于涉及的数据量很大,这些操作可能需要 5 分钟到几个小时不等。
我注意到如果在 SSMS 中执行一条 SQL 语句,那么整个事务将自动回滚,以防 SSMS 在执行完成之前失去与服务器的连接。这对于长时间运行的查询是有问题的,例如在本地 wifi 连接问题的情况下,或者如果我只是想关闭我的计算机以离开办公室。
有没有什么方法可以指示 SQL Server 或 SSMS 在不需要打开连接的情况下执行 SQL 语句?我们不能使用 SQL Server 代理作业,因为这是一个 Azure SQL DB,我们希望尽可能避免基于其他 Azure 服务的解决方案,因为这只是为了满足简单的 Ad-hoc 需求。
我们尝试了 SSMS 中的“执行后丢弃结果”选项,但这仍然保持打开的连接,直到语句完成执行:
这不是我正在寻找的异步解决方案,因为我并不真正关心执行结果(我总是可以检查查询是否仍在运行,例如使用 sys.dm_exec_requests)。换句话说,就是一种简单的 T-SQL 查询“即发即弃”机制。
【问题讨论】:
-
“一劳永逸”的问题是你假设成功。你真的想开枪然后忘记,4 小时后发现它没有完成你想要的,但你没有错误消息要检查?
-
谈论
fire-and-forget没有任何意义。当 any 连接关闭时,事务会回滚。服务器不关心该查询来自何处。如果您希望查询在后台运行,请将其安排为作为作业运行,或作为 SSIS 包的一部分运行。这也有其他机制 -
@Damien_The_Unbeliever - 好点。请记住,这是一个 Azure SQL 数据库,您认为“从其他地方”运行查询以支持我所描述的临时场景的最简单方法是什么?
-
您必须找到一台连接稳定的机器。没有办法解决这个问题,因为 SQL Server 不会在对方不在的地方保持打开的连接。理想情况下,您会在机器本身上执行此操作(如在计划作业中),但这不是 Azure SQL DB 的选项,因此您可以获得的最接近的是 Azure VM。要么在这样的远程机器上使用 RDP 完成所有工作,要么投资一些 Cat 5 电缆。
-
如果你打算使用 Azure VM(我以为你不需要额外的组件?)那么你可能想节省一些成本,而是使用
Azure Automation来启动预定的 SQL
标签: sql-server tsql azure-sql-database ssms