2010-08-05 31 views
6

我想从http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx使用脚本得到具体运行SQL-服务器的进度信息恢复作业。为了实现这一目标,我已经改变了它一点点:问题得到一个SQL-服务器的进展状况,还原作业

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') 

不幸的是这不起作用,因为r.database_id是永远等于DB_ID(“数据库名称”)。这是什么原因?这条SQL语句有什么问题?此脚本适用于'r.command = BACKUP DATABASE'

是否有其他基于T-SQL的可能性来获取特定SQL-Server作业的进度状态?

回答

2

当您运行BACKUP数据库联机并且该命令在数据库内运行。但是,当您运行RESTORE时,数据库无法联机(您正在积极恢复它,因此无法联机),因此该命令无法在所述数据库的上下文中执行。

因此而不是在DB_ID戳去猜测哪一个要求是你的,对SqlConnection的执行RESTORE命令之前只是偷偷的@@SPID,然后看看与session_id请求:这将是你恢复请求。

+0

SPID是否是整个RESTORE过程的常量?我也可以使用connectio_id吗? – Elmex 2010-08-06 13:29:45

+0

@@ SPID对于一个会话是不变的。你不能使用connection_id。使用session_id。 – 2010-08-06 15:02:32