2010-08-05 3 views
6

ich das Drehbuch von http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx verwenden möge Fortschrittsinformationen einen spezifische laufenden SQL-Server erhalten Wiederherstellungsauftrag. Um achive dies, ich habe es ein wenig geändert:Problem des Fortschritt Status eines SQL-Server wiederherstellen Job zu bekommen

SELECT command, 
      s.text, 
      start_time, 
      percent_complete, 
      CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar) + ' hour(s), ' 
        + CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar) + 'min, ' 
        + CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar) + ' sec' as running_time, 
      CAST((estimated_completion_time/3600000) as varchar) + ' hour(s), ' 
        + CAST((estimated_completion_time %3600000)/60000 as varchar) + 'min, ' 
        + CAST((estimated_completion_time %60000)/1000 as varchar) + ' sec' as est_time_to_go, 
      dateadd(second,estimated_completion_time/1000, getdate()) as est_completion_time 
FROM sys.dm_exec_requests r 
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s 
WHERE r.command = 'RESTORE DATABASE' and r.database_id = db_id('database_name') 

Leider funktioniert das nicht, weil r.database_id nie gleich ist DB_ID (‚database_name‘). Was ist der Grund dafür? Was ist falsch an dieser SQL-Anweisung? Dieses Skript funktioniert einwandfrei für 'r.command = BACKUP DATABASE'.

Gibt es andere T-SQL-basierte Möglichkeiten, den Fortschrittsstatus eines bestimmten SQL-Server-Jobs abzurufen?

Antwort

2

Wenn Sie BACKUP ausführen, ist die Datenbank online und der Befehl wird in der Datenbank ausgeführt. Wenn Sie jedoch RESTORE ausführen, kann die Datenbank nicht online sein (Sie stellen sie aktiv wieder her, sodass sie nicht online sein kann), daher kann der Befehl nicht im Kontext dieser Datenbank ausgeführt werden.

Anstatt also am DB_ID des Stoßens zu erraten, welche eine Anfrage bei Ihnen ist, einfach die @@SPID schleichen, bevor Sie den Befehl RESTORE auf der SqlConnection Ausführung und auf Wunsch schauen dann mit diesem session_id: dass es Ihre RESTORE Anfrage sein wird.

+0

Ist die SPID für den gesamten RESTORE-Prozess konstant? Kann ich die connectio_id auch benutzen? – Elmex

+0

@@ SPID ist für eine Sitzung konstant. Sie können die Verbindungs-ID nicht verwenden. Verwenden Sie Sitzungs-ID. –

Verwandte Themen