我想使用http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx中的脚本获取特定运行SQL-Server还原作业的进度信息。要实现这个目标,我已经改变了一点:
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('database_name')。这是什么原因?这个SQL语句有什么问题?此脚本适用于'r.command = BACKUP DATABASE'。
是否有其他基于T-SQL的可能性来获取特定SQL-Server作业的进度状态?
答案 0 :(得分:2)
运行BACKUP时,数据库处于联机状态,命令在数据库中运行。但是当您运行RESTORE时,数据库无法联机(您正在主动还原它,因此无法联机)因此该命令无法在所述数据库的上下文中执行。
因此,不要在DB_ID上猜测哪一个请求是你的,只需在SqlConnection上执行RESTORE命令之前潜行@@SPID
,然后用session_id
查看请求:它将是您的RESTORE请求。