Nel lontano 2006, Paul Randal ha documentato la PAGINA DBCC sul suo blog Microsoft a https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. Nel suo post, noterai che per restituire l’output dalla PAGINA DBCC allo schermo, devi prima abilitare trace flag 3604. Il post sul blog sopra mostra alcuni esempi dei risultati e li utilizza per ulteriori azioni. Sfortunatamente, questo metodo richiede un intervento manuale per ottenere i dati necessari dalla pagina per lavorare ulteriormente con esso.
Sai, sicuramente sarebbe bello se l’intervento manuale potesse essere rimosso e automatizzare completamente il compito che stai cercando. Questo post sul blog ti mostrerà come questo può essere fatto, e darà alcuni esempi di farlo.
Nel mio ultimo post sul blog, ho introdotto un’impostazione opzionale per diversi comandi DBCC: CON TABLERESULTS. Questo restituisce l’output in formato tabulare, in modo che l’output possa essere consumato. A quanto pare, questa impostazione opzionale funziona anche con la pagina DBCC. Si può vedere esaminando le informazioni del database (pagina 9) del database master:
il codice Sorgente | ![]() ![]() ![]() |
DBCC PAGINA ('master', 1, 9, 3) with TABLERESULTS;
Questa affermazione, che può essere eseguito senza il flag di traccia, restituisce i dati sulla pagina in 4 colonne: ParentObject, Oggetto, Campo e VALORE. A quanto pare, questa particolare pagina di ogni database ha molte informazioni interessanti su di esso. Automatizziamo l’acquisizione di una specifica informazione da questa pagina:
Codice sorgente | ![]() ![]() ![]() |
SE OBJECT_ID ('tempdb.dbo.#DBCCPAGE') NON È NULL DROP TABLE #DBCCPAGE;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));INSERT INTO #DBCCPAGEEXECUTE ('DBCC PAGE ("master", 1, 9, 3) WITH TABLERESULTS;'); SELECT LastGoodDBCCDate = CONVERT(DATETIME, VALUE)FROM #DBCCPAGEWHERE Field = 'dbi_dbccLastKnownGood';
Questo meraviglioso frammento di codice restituisce l’ultima volta che un DBCC CHECKDB è stato eseguito con successo contro il database master. Wow how quanto e ‘ dolce? Quando si scopre un server in cui il lavoro CHECKDB non è riuscito al punto che il lavoro ha solo voci non riuscite nella cronologia dei lavori, è ora possibile scoprire quanto tempo è passato da quando è stato eseguito con successo.
Il “trucco” per fare questo lavoro è incapsulare il comando DBCC come una stringa e chiamarlo con la funzione EXECUTE (). Viene utilizzato come parte di un’istruzione INSERT INTO / EXECUTE, in modo che i risultati della PAGINA DBCC vengano inseriti in una tabella (in questo caso viene utilizzata una tabella temporanea, sebbene sia possibile utilizzare anche una tabella variabile o una tabella permanente). Ci sono tre semplici passaggi per questo processo:
- Creare una tabella (permanente / temporanea ) o variabile tabella per contenere l’output.
- Inserire in questa tabella i risultati dell’istruzione DBCC PAGE utilizzando INSERT INTO / EXECUTE.
- Seleziona i dati che stai cercando dalla tabella.
Utilizzando un cursore, puoi facilmente scorrere tutti i database sulla tua istanza per ottenere l’ultima volta che hanno avuto un DBCC CHECKDB eseguito con successo contro di loro. Quanto segue utilizza sp_MSforeachdb (che a sua volta utilizza un cursore per scorrere tutti i database) per fare proprio questo:
Codice sorgente | ![]() ![]() ![]() |
SE OBJECT_ID ('tempdb.dbo.# DBCCPAGE') NON È NULL DROP TABLE # DBCCPAGE; SE OBJECT_ID ('tempdb.dbo.# CheckDBDates') NON È NULL DROP TABLE # CheckDBDates;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));CREATE TABLE #CheckDBDates ( database_name sysname, LastCheckDB DATETIME); EXECUTE sp_MSforeachdb 'TRUNCATE TABLE #DBCCPAGE;INSERT INTO #DBCCPAGE EXECUTE (''DBCC PAGE (''''?'''', 1, 9, 3) WITH TABLERESULTS;'');INSERT INTO #CheckDBDatesSELECT ''?'', CONVERT(DATETIME, VALUE)FROM #DBCCPAGEWHERE Field = ''dbi_dbccLastKnownGood'';'; SELECT database_name, LastCheckDBFROM #CheckDBDates;
E qui abbiamo tutti i database sulla tua istanza e la data in cui DBCC CHECKDB è stato eseguito con successo contro di esso – beh, almeno per i database che sp_MSforeachdb non ha saltato (vedi https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ per ulteriori informazioni su questo).
In sintesi, utilizzando l’opzione” WITH TABLERESULTS ” di DBCC, possiamo automatizzare i processi che utilizzano la PAGINA DBCC, invece di richiedere un intervento manuale per risolvere questo problema.
Nelle prossime puntate, esamineremo altri usi dell’uso di “WITH TABLERESULTS” per automatizzare l’output DBCC.