Sql server T-SQL-从还原作业获取runduration

Sql server T-SQL-从还原作业获取runduration,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,我使用下面的代码拉取3列: 服务器名 数据库名称 开始恢复的日期/时间 代码: 我想做的是获取与msdb..sysjobhistory表关联的RunDuration。我不能,为了我的生命,看到如何将表与上面的代码联系起来。我相信有一个迂回的方法来获取我所寻找的信息 有什么建议吗 谢谢 您可以在SQL Server日志中找到还原的结束日期时间。您可以使用xp\U readerrorlog来读取日志。请注意,根据您的版本,邮件的格式可能会有所不同。此代码适用于SQL Server 2012 CR

我使用下面的代码拉取3列:

  • 服务器名
  • 数据库名称
  • 开始恢复的日期/时间
代码:

我想做的是获取与
msdb..sysjobhistory
表关联的
RunDuration
。我不能,为了我的生命,看到如何将表与上面的代码联系起来。我相信有一个迂回的方法来获取我所寻找的信息

有什么建议吗


谢谢

您可以在SQL Server日志中找到还原的结束日期时间。您可以使用xp\U readerrorlog来读取日志。请注意,根据您的版本,邮件的格式可能会有所不同。此代码适用于SQL Server 2012

CREATE TABLE #t (LogDate DATETIME, ProcessInfo VARCHAR(100), RowVal VARCHAR(512));

INSERT INTO #t
EXEC master.dbo.xp_readerrorlog;

WITH RestoreDate AS (
    SELECT
        LEFT(REPLACE(RowVal, 'Database was restored: Database: ', ''), CHARINDEX(', creation', REPLACE(RowVal, 'Database was restored: Database: ', '')) - 1) AS DbName,
        LogDate
    FROM
        #t
    WHERE
        RowVal LIKE 'Database was restored: Database: %'),
    LastRestores AS (
    SELECT 
        @@SERVERNAME AS [ServerName],
        [d].[name] AS [DatabaseName],
        CONVERT(VARCHAR, r.restore_date, 100) AS [RestoreDateTime],
        RowNum = ROW_NUMBER() OVER (PARTITION BY d.NAME 
                                    ORDER BY r.[restore_date] DESC)
    FROM 
        master.sys.databases d
    LEFT OUTER JOIN 
        msdb.dbo.[restorehistory] r ON r.[destination_database_name] = d.NAME)
SELECT 
    l.[ServerName],
    l.[DatabaseName],
    l.[RestoreDateTime],
    MAX(r.LogDate) AS LogDate,
    CONVERT(VARCHAR, MAX(r.LogDate), 100) AS FormattedLogDate
FROM 
    [LastRestores] l
JOIN
    RestoreDate r
        ON l.DatabaseName = r.DbName
WHERE 
    l.[RowNum] = 1
    AND l.DatabaseName NOT IN ('master', 'model', 'msdb', 'tempdb')
    AND CONVERT(VARCHAR(12), [RestoreDateTime]) = CONVERT(VARCHAR(12), GETDATE())
GROUP BY
    l.[ServerName],
    l.[DatabaseName],
    l.[RestoreDateTime];

DROP TABLE #t;

终于开始使用这个代码了&肖恩,我有一个关于它的问题。这正是我想要的!谢谢尽管如此,我一直在尝试将“LogDate”转换为“Mon,day-year-time”格式,类似于“StartDateTime”字段的格式。有什么建议吗?谢谢我在结果集中添加了一个格式化的日期列。谢谢,肖恩。有趣的是,我以为我做了和你一样的事情来安排约会。我的思路是正确的,但由于某种原因,我一直在为“FormattedLogDate”设置错误的日期。这一针见血!继续前进。
CREATE TABLE #t (LogDate DATETIME, ProcessInfo VARCHAR(100), RowVal VARCHAR(512));

INSERT INTO #t
EXEC master.dbo.xp_readerrorlog;

WITH RestoreDate AS (
    SELECT
        LEFT(REPLACE(RowVal, 'Database was restored: Database: ', ''), CHARINDEX(', creation', REPLACE(RowVal, 'Database was restored: Database: ', '')) - 1) AS DbName,
        LogDate
    FROM
        #t
    WHERE
        RowVal LIKE 'Database was restored: Database: %'),
    LastRestores AS (
    SELECT 
        @@SERVERNAME AS [ServerName],
        [d].[name] AS [DatabaseName],
        CONVERT(VARCHAR, r.restore_date, 100) AS [RestoreDateTime],
        RowNum = ROW_NUMBER() OVER (PARTITION BY d.NAME 
                                    ORDER BY r.[restore_date] DESC)
    FROM 
        master.sys.databases d
    LEFT OUTER JOIN 
        msdb.dbo.[restorehistory] r ON r.[destination_database_name] = d.NAME)
SELECT 
    l.[ServerName],
    l.[DatabaseName],
    l.[RestoreDateTime],
    MAX(r.LogDate) AS LogDate,
    CONVERT(VARCHAR, MAX(r.LogDate), 100) AS FormattedLogDate
FROM 
    [LastRestores] l
JOIN
    RestoreDate r
        ON l.DatabaseName = r.DbName
WHERE 
    l.[RowNum] = 1
    AND l.DatabaseName NOT IN ('master', 'model', 'msdb', 'tempdb')
    AND CONVERT(VARCHAR(12), [RestoreDateTime]) = CONVERT(VARCHAR(12), GETDATE())
GROUP BY
    l.[ServerName],
    l.[DatabaseName],
    l.[RestoreDateTime];

DROP TABLE #t;