過早退出 T-SQL 中的 while 循環並查看輸出
我在周末執行了一個帶有 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
。不幸的是,它將完全結束腳本,失去局部變數和臨時表,並斷開目標會話。任何打開的事務都必須回滾,這將大致與事務已經打開、給予或接受的時間一樣長。