Sql server T-SQL-从还原作业获取runduration
我使用下面的代码拉取3列: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
- 服务器名
- 数据库名称
- 开始恢复的日期/时间
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;