使用T-SQL是否可以显示正在备份或还原的数据库的名称?

时间:2019-03-05 14:09:43

标签: sql-server tsql database-backups database-restore

我有一些用于监视备份和还原的代码,给我一个“微软分钟”,它说明何时完成 ,运行了多长时间以及其他一些信息。代码如下:

WITH CTE
AS (
SELECT @@SERVERNAME AS [ServerName]
    ,db_name(r.database_id) AS DatabaseName
    ,CONVERT(NUMERIC(6, 2), r.percent_complete) AS [PercentComplete]
    ,CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GetDate()), 20) AS [ETACompletionTime]
    ,CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0) AS [ElapsedMinutes]
    ,CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0 / 60.0) AS [ElapsedHours]
    ,CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0) AS [ETAMinutes]
    ,CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0 / 60.0) AS [ETAHours]
    ,CONVERT(VARCHAR(1000), (
            SELECT SUBSTRING(TEXT, r.statement_start_offset / 2, CASE 
                        WHEN r.statement_end_offset = - 1
                            THEN 1000
                        ELSE (r.statement_end_offset - r.statement_start_offset) / 2
                        END)
            FROM sys.dm_exec_sql_text(sql_handle) --sql_handle is a column from sys.dm_exec_requests
            )) AS [TSQLCode]
FROM sys.dm_exec_requests r
WHERE command IN (
        'RESTORE DATABASE'
        ,'BACKUP DATABASE'
        )
)
SELECT [ServerName]
,SUBSTRING([TSQLCode], CHARINDEX('DATABASE [', [TSQLCode]) + 10, CHARINDEX(']', [TSQLCode], (CHARINDEX('DATABASE [', [TSQLCode]) + 10)) - (CHARINDEX('DATABASE [', [TSQLCode]) + 10)) AS [DatabaseName]
,[PercentComplete]
,[ETACompletionTime]
,[ElapsedMinutes]
,[ElapsedHours]
,[ETAMinutes]
,[ETAHours]
,Cast(CASE 
        WHEN charindex('Rest', [TSQLCode], 0) > 0
            THEN 'Restoring'
        ELSE 'Backup'
        END AS VARCHAR(10)) AS BackupRestore
,[TSQLCode]
FROM CTE

在大多数情况下,只要使用[databasename](方括号)封装数据库,此代码就可以正常工作。如果不是,则会出现以下错误。

Invalid length error

对于我们必须还原的所有数据库,以及我们要还原的许多很多工作,我不知道哪些工作有或没有方括号。而且我必须考虑可能没有使用方括号的人员的临时备份/还原作业。

因此,我正在寻找一种无需解析即可获取正在备份或还原的数据库的方法。

1 个答案:

答案 0 :(得分:2)

patindex('%DATABASE[ \[]%', [TSQLCode])交换charindex会使您的+10混乱,仅替换备份数据库并还原数据库,ltrim和charindex''可能会更容易。我没有测试下面的“代码”,但是对我来说看起来不错。随意摆弄!

left(ltrim(replace(replace(TSQLCode, 'backup database',''),'restore database','')),charindex(' ',ltrim(replace(replace(TSQLCode, 'backup database',''),'restore database',''))))

编辑:既然我前面有sql server,请尝试:

WITH CTE
AS (
SELECT @@SERVERNAME AS [ServerName]
    ,db_name(r.database_id) AS DatabaseName
    ,CONVERT(NUMERIC(6, 2), r.percent_complete) AS [PercentComplete]
    ,CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GetDate()), 20) AS [ETACompletionTime]
    ,CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0) AS [ElapsedMinutes]
    ,CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0 / 60.0) AS [ElapsedHours]
    ,CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0) AS [ETAMinutes]
    ,CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0 / 60.0) AS [ETAHours]
    ,replace(replace(CONVERT(VARCHAR(1000), (
            SELECT replace(replace(replace(replace(replace(replace(SUBSTRING(TEXT, r.statement_start_offset / 2, CASE 
                        WHEN r.statement_end_offset = - 1
                            THEN 1000
                        ELSE (r.statement_end_offset - r.statement_start_offset) / 2
                        END),']',''),'[',''),char(10),' '),char(13), ' '),char(9), ' '),'  ',' ')
            FROM sys.dm_exec_sql_text(sql_handle) --sql_handle is a column from sys.dm_exec_requests
            )),'  ',' '),'  ',' ') AS [TSQLCode]
FROM sys.dm_exec_requests r
WHERE command IN (
        'RESTORE DATABASE'
        ,'BACKUP DATABASE'
        )
)
SELECT [ServerName]
,SUBSTRING([TSQLCode], CHARINDEX('DATABASE ', [TSQLCode]) + 9, CHARINDEX(' ', [TSQLCode], (CHARINDEX('DATABASE ', [TSQLCode]) + 9)) - (CHARINDEX('DATABASE ', [TSQLCode]) + 9)) AS [DatabaseName]
,[PercentComplete]
,[ETACompletionTime]
,[ElapsedMinutes]
,[ElapsedHours]
,[ETAMinutes]
,[ETAHours]
,Cast(CASE 
        WHEN charindex('Rest', [TSQLCode], 0) > 0
            THEN 'Restoring'
        ELSE 'Backup'
        END AS VARCHAR(10)) AS BackupRestore
,[TSQLCode]
FROM CTE

已更新为删除(\ n \ r \ t)(换行,回车,制表符),并“尝试”清除了足够的双精度空格,以免干扰您的输出。

知道您的ascii table很好的次数之一。

删除cte中的[],然后不处理[],在这里进行了我的测试。