Разобрать путь резервного копирования \ восстановления и имя файла во время резервного копирования \ восстановления - PullRequest
0 голосов
/ 13 ноября 2018

Я пишу веб-приложение, которое отслеживает резервное копирование и восстановление, пока они происходят. Меня попросили добавить к нему способ показать путь к резервной копии \ восстановлению и имя файла , как это происходит . Я могу, конечно, получить командную строку, которая выполняется во время резервного копирования \ восстановления, поэтому я хотел бы извлечь путь и имя файла из этой командной строки. Так что с моим текущим кодом я могу получить это в виде возврата:

BACKUP DATABASE [DatabaseName] TO DISK = N'\\nas01\sqlbackups$\ServerName\DatabaseName.bak'   WITH NOFORMAT,   INIT,   NAME = N'DatabaeName-Full Database Backup',   SKIP,   NOREWIND,   NOUNLOAD,   STATS = 10  

Из этого я хотел бы извлечь \\ nas01 \ sqlbackups $ \ ServerName \ DatabaseName.bak

Если нет извлечения из кода, есть ли способ извлечь его из другой таблицы, во время его работы?

Это код, который я запускаю, чтобы получить состояние текущей резервной копии \ восстановления:

SELECT r.session_id
,r.command
,CONVERT(NUMERIC(6, 2), r.percent_complete) AS [Percent Complete]
,CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GetDate()), 20) AS [ETA Completion Time]
,CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0) AS [Elapsed Min]
,CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0 / 60.0) AS [Elapsed Hours]
,CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0) AS [ETA Min]
,CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0 / 60.0) AS [ETA Hours]
,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)
        )) AS [TSQLCode]    
        FROM sys.dm_exec_requests r 
WHERE command IN (
    'RESTORE DATABASE'
    ,'BACKUP DATABASE'
    ,'BACKUP LOG'
    ,'RESTORE LOG'
    )

1 Ответ

0 голосов
/ 13 ноября 2018

Я уверен, но я думаю История резервного копирования может показать вам информацию о текущем процессе резервного копирования.Вы можете попробовать, хотя.В противном случае вы можете попытаться разобрать текст команды.Сначала удалите текст перед «TO DISK», найдите первую и вторую цитату и вставьте текст между ними.Используйте такой код:

declare @cmd nvarchar(max) = N'BACKUP DATABASE [DatabaseName] TO DISK = N''\\nas01\sqlbackups$\ServerName\DatabaseName.bak''   WITH NOFORMAT,   INIT,   NAME = N''DatabaeName-Full Database Backup'',   SKIP,   NOREWIND,   NOUNLOAD,   STATS = 10  '

-- Remove the text before "TO DISK"
set @cmd = SUBSTRING(@cmd, PATINDEX(N'%TO DISK%', @cmd), LEN(@cmd))
print @cmd
-- Remove the text before and including the first quote
set @cmd = SUBSTRING(@cmd, PATINDEX(N'%''%', @cmd) + 1, LEN(@cmd))
print @cmd
-- Get the text from the start to the next quote
set @cmd = SUBSTRING(@cmd, 1, PATINDEX(N'%''%', @cmd) - 1)
print @cmd
...