RAISERROR WITH NOWAIT

Les scripts SQL et les procédures stockées n'affichent pas le résultat des commandes PRINT ou RAISERROR de manière à nous informer sur l'avancement de notre script.

Question souvent posée : comment faire pour afficher mes informations au fil de l'eau lors de l'exécution ? La solution : utiliser RAISERROR WITH NOWAIT !

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...