我在周末运行了一个带有 CURRENT_TIMESTAMP 条件的 while 循环,问题是我不小心将条件设置为 2020-08-06 而不是 2020-06-08(哎呀)。有没有办法手动退出循环并查看到目前为止的结果?我认为我不可能更改系统时间以使循环存在,因为 SQL 服务器不在本地运行。
我在周末运行了一个带有 CURRENT_TIMESTAMP 条件的 while 循环,问题是我不小心将条件设置为 2020-08-06 而不是 2020-06-08(哎呀)。有没有办法手动退出循环并查看到目前为止的结果?我认为我不可能更改系统时间以使循环存在,因为 SQL 服务器不在本地运行。
成功很大程度上取决于结果的存储位置。如果它们被写入普通表,那么您可以简单地查询该表。如果有一个会阻塞新查询的事务打开,请使用 NOLOCK 提示。如果您使用的是快照隔离,我不知道您如何获取开放事务的版本化数据。
如果所有结果都在临时表中,您将遇到困难。这些表的范围仅限于会话,因此从不同的会话访问它们会很棘手。
您可以查看 TempDB 的元数据以找到表的全名并明确查询。不知道行不行,没试过。(我试过了;它不起作用。)如果代码通过 SSMS 运行,您可以在不结束会话的情况下停止执行。这将使临时表保持完整并可供会话使用。使用菜单 Query -> Cancel Executing Query 取消(映射到工具栏中的红色方块)。如果有一个开放的交易,该交易将保持开放。您将不得不手动提交或回滚它。
取消是通过向 SQL Server 发送“注意”消息来实现的。其他客户可能支持也可能不支持。在脚本环境(例如 Powershell、Python)中,如果查询是异步提交的,则可以在原始连接或查询对象上调用“取消”方法(或等效方法)。
拥有足够高的访问权限,您可以查看磁盘结构。Paul White 在这里写了一个方法。根据已写入的内容,从 DBCC PAGE 转录转储可能需要与重新运行查询一样长的时间。
如果结果在变量中,您可以将调试器连接到 SQL Server 进程,暂停其执行并进行搜索。祝你好运。如果系统上有其他用户或后台系统活动,则可能很难将您想要的值与所有其他存在的值区分开来。当然,它没有以任何方式记录或支持。不要在共享生产实例上尝试此操作。
最后,如果您使用的是 SSMS,请查看消息选项卡。您永远不会知道,编写脚本的人可能已经放置了 PRINT 语句来跟踪进度。
结束循环很容易。从 SSMS 选项卡或 DMV ( sys.dm_exec_sessions 等) 中找到 SPID,然后发出
KILL session_id
。不幸的是,它将完全结束脚本,丢失局部变量和临时表,并断开目标会话。任何打开的事务都必须回滚,这将大致与事务已经打开、给予或接受的时间一样长。