sql server plans Come scarico il buffer PRINT in TSQL?



sql print doesn t work (5)

In SQL Server 2005 è in esecuzione una stored procedure molto lunga che sto tentando di eseguire il debug e sto utilizzando il comando "print" per eseguirlo. Il problema è che sto recuperando solo i messaggi da SQL Server alla fine del mio sproc - Mi piacerebbe essere in grado di svuotare il buffer dei messaggi e vedere questi messaggi immediatamente durante il runtime dello sproc, piuttosto che al momento stesso fine.

https://src-bin.com


Answer #1

Basandosi sulla risposta di @JoelCoehoorn, il mio approccio è quello di lasciare tutte le mie dichiarazioni PRINT in atto, e semplicemente seguirle con l'istruzione RAISERROR per provocare il flush.

Per esempio:

PRINT 'MyVariableName: ' + @MyVariableName
RAISERROR(N'', 0, 1) WITH NOWAIT

Il vantaggio di questo approccio è che le istruzioni PRINT possono concatenare stringhe, mentre RAISERROR non può. (Quindi in entrambi i casi avete lo stesso numero di righe di codice, come dovreste dichiarare e impostare una variabile da utilizzare in RAISERROR).

Se, come me, usi AutoHotKey o SSMSBoost o uno strumento equivalente, puoi facilmente impostare un collegamento come "] flush" per inserire la linea RAISERROR per te. Questo ti fa risparmiare tempo se è la stessa linea di codice ogni volta, cioè non ha bisogno di essere personalizzato per contenere un testo specifico o una variabile.


Answer #2

Sì ... Il primo parametro della funzione RAISERROR richiede una variabile NVARCHAR. Quindi prova quanto segue;

-- Replace PRINT function
DECLARE @strMsg NVARCHAR(100)
SELECT @strMsg = 'Here''s your message...'
RAISERROR (@strMsg, 0, 1) WITH NOWAIT

O

RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT

Answer #3

Solo per il riferimento, se si lavora in script (elaborazione batch), non in stored procedure , l'output di scarico viene attivato dal comando GO, ad es.

print 'test'
print 'test'
go

In generale, la mia conclusione è la seguente: l'output dell'esecuzione di script mssql, l'esecuzione in SMS GUI o con sqlcmd.exe, viene svuotato su file, stdoutput, finestra gui sulla prima istruzione GO o fino alla fine dello script.

Il lavaggio all'interno delle stored procedure funziona in modo diverso, poiché non è possibile posizionare GO all'interno.

Riferimento: dichiarazione tsql Go


Answer #4

Un'altra opzione migliore è quella di non dipendere da PRINT o RAISERROR e basta caricare le istruzioni "print" in una ## Temp table in TempDB o una tabella permanente nel database che ti darà visibilità immediata dei dati tramite un'istruzione SELECT da un'altra finestra . Questo funziona al meglio per me. L'utilizzo di una tabella permanente funge anche da registro di ciò che è accaduto in passato. Le istruzioni di stampa sono utili per gli errori, ma utilizzando la tabella dei registri è anche possibile determinare il punto esatto di errore in base all'ultimo valore registrato per quella particolare esecuzione (supponendo che si rintracci l'ora di inizio dell'esecuzione complessiva nella tabella dei registri).


Answer #5

Usa la funzione RAISERROR :

RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT

Non dovresti sostituire completamente tutte le tue stampe con raiserror. Se hai un loop o un cursore grande da qualche parte, fallo una volta o due volte per iterazione o anche solo per più iterazioni.

Inoltre: ho appreso per la prima volta di RAISERROR a questo link, che ora considero la fonte definitiva sulla gestione degli errori di SQL Server e che vale sicuramente una lettura:
http://www.sommarskog.se/error-handling-I.html





printing