Sql-Server

使用列印跟踪時間密集型儲存過程

  • November 14, 2014

我不是數據庫管理員,我的 SQL-foo 也不是很好(還),但是有一些任務要在 MSSQL 中完成,其中一個是一個相當耗時的過程,我從 a CURSORand中獲取WHILE @@FETCH_STATUS = 0,我有多個SELECTs 和一個UPDATEon巨大的桌子。(該程序有效,我已經與同事核對過)

現在在腳本或程序中,我將有一個簡單的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. PRINT在程序完成之前不會顯示任何輸出,這不是很有用。我在批處理腳本中大量使用這種技術來更新和刪除我希望保持批處理大小較小的地方。

在下面的範例中,我設置了一個@Batchsize變數,並且我的循環一次只能處理那麼多行,然後我用RAISERROR. 使用 0 的嚴重性很重要,這意味著不會將其視為錯誤,就像資訊性消息一樣。

DECLARE @MsgStr varchar(200) = 'Inserted ' + CAST(@BatchSize AS varchar(10)) + ' rows...'

RAISERROR(@MsgStr, 0, 0) WITH NOWAIT

引用自:https://dba.stackexchange.com/questions/82573