Sql-Server
使用列印跟踪時間密集型儲存過程
我不是數據庫管理員,我的 SQL-foo 也不是很好(還),但是有一些任務要在 MSSQL 中完成,其中一個是一個相當耗時的過程,我從 a
CURSOR
and中獲取WHILE @@FETCH_STATUS = 0
,我有多個SELECT
s 和一個UPDATE
on巨大的桌子。(該程序有效,我已經與同事核對過)現在在腳本或程序中,我將有一個簡單的print @current_cursor或在每個中列印一個計數器
WHILE
以獲得一些回饋。我怎麼能在 MSSQL 中做這樣的事情?(使用 Microsoft SQL Server Enterprise Edition v9.00.3042.00,即 SQL Server 2005 Service Pack 2)
我可以做一個
print @current_cursor
,還是在我的情況下這是不行的?編輯
我已經
RAISEERROR
使用以下語句進行了測試:DECLARE @cur_id int; SET @cur_id = 0; DECLARE Cur CURSOR FOR SELECT ID FROM TableA WHERE ID > 100 ORDER BY ID DESC OPEN Cur FETCH NEXT FROM Cur INTO @cur_id; WHILE @@FETCH_STATUS = 0 BEGIN RAISERROR(@cur_id, 0, 0) WITH NOWAIT FETCH NEXT FROM Cur INTO @cur_id; END
但這會導致一段時間的等待而沒有輸出,然後是無盡的牆(我假設每個都有一個
RAISERROR
):Msg 18054, Level 16, State 1, Line 17 Error 983700, severity 0, state 0 was raised, but no message with that error number was found in sys.messages. If error is larger than 50000, make sure the user-defined message is added using sp_addmessage.
在 SQL Server 中(我認為這應該適用於你說你正在使用的舊版本),通常的方法是使用
RAISERROR
.在下面的範例中,我設置了一個
@Batchsize
變數,並且我的循環一次只能處理那麼多行,然後我用RAISERROR
. 使用 0 的嚴重性很重要,這意味著不會將其視為錯誤,就像資訊性消息一樣。DECLARE @MsgStr varchar(200) = 'Inserted ' + CAST(@BatchSize AS varchar(10)) + ' rows...' RAISERROR(@MsgStr, 0, 0) WITH NOWAIT