Par exemple, si nous exécutons le script suivant, les messages ne vont pas à chaque tour de boucle comme on aurait pu le souhaiter, mais en bloc. Curieusement, selon la commande utilisée (PRINT ou RAISERROR), les messages vont s'afficher en un ou plusieurs blocs, voire attendre pour s'afficher la fin de l'exécution. C'est en tout cas inutilisable pour suivre l'avancement de notre boucle...

DECLARE @a INT = 1, @chra VARCHAR(2)
WHILE @a <= 60
BEGIN
SET @chra = CAST(@a AS varchar(2))
PRINT @chra
RAISERROR (@chra,0,1)
WAITFOR DELAY '00:00:01'
SET @a=@a+1
END

La solution est simple : utiliser RAISERROR avec l'option NOWAIT en lieu et place du PRINT.

DECLARE @a INT = 1, @chra VARCHAR(2)
WHILE @a <= 60
BEGIN
SET @chra = CAST(@a AS varchar(2))
-- PRINT @chra
RAISERROR (@chra,0,1) WITH NOWAIT
WAITFOR DELAY '00:00:01'
SET @a=@a+1
END

Chose amusante, si on laisse les deux instructions actives (PRINT et RAISERROR WITH NOWAIT), le PRINT s'affiche aussi à chaque tour de boucle, déclenché par l'affichage du RAISERROR...