sql-server - 获取 SQL-Server 还原作业的进度状态时出现问题

标签 sql-server database tsql sql-server-2008

我想使用来自 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 作业的进度状态?

最佳答案

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

因此,与其查看 DB_ID 来猜测哪个请求是您的请求,不如在对 SqlConnection 执行 RESTORE 命令之前偷偷输入 @@SPID,然后查看带有该 的请求session_id:这将是您的 RESTORE 请求。

关于sql-server - 获取 SQL-Server 还原作业的进度状态时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3419273/

相关文章:

sql-server - Entity Framework 不会解决与复合主键的 PK-FK 关系?

sql - 使用计算值枚举两个日期之间的年份

mysql - 数据库设计(自定义属性取决于另一个属性)- MySQL 或其他

tsql - t-sql NOT IN 多列

mysql - GROUP BY 逗号分隔列表的成员

sql-server-2008 - 是否可以在 sql server 的临时表中创建计算字段

sql - 选择 2 列中没有特定值的记录

sql - 如何获取同一年中两个日期之间的日期差异,其中一个日期来自输入日期而不是年份

sql - 如何返回匹配 JOIN 条件某些部分的数据,几乎像 FULL OUTER JOIN?

php 为数据库中的每条记录做一些事情