2016-04-13 7 views
1

ich den Code unten bin mit 3 Spalten ziehen:T-SQL - Get runduration von einem Wiederherstellungsauftrag

  • Server Name
  • Datenbankname
  • Datum/Zeit begann Wiederherstellung

Code:

WITH 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 
    [ServerName], [DatabaseName], [RestoreDateTime] 
FROM 
    [LastRestores] 
WHERE 
    [RowNum] = 1 
    AND DatabaseName NOT IN ('master', 'model', 'msdb', 'tempdb') 
    AND CONVERT(VARCHAR(12), [RestoreDateTime]) = CONVERT(VARCHAR(12), GETDATE()) 

Was ich tun möchte, ist die 0 erhalten, die in der Tabelle msdb..sysjobhistory gebunden ist. Ich kann nicht für mein Leben sehen, wie ich diesen Tisch mit meinem obigen Code binden kann. Ich bin mir sicher, dass es einen runden Weg gibt, um die Informationen zu bekommen, nach denen ich suche.

Irgendwelche Vorschläge?

Danke!

Antwort

2

Sie können die Enddatumszeit einer Wiederherstellung in den SQL Server-Protokollen finden. Sie können xp_readerrorlog verwenden, um die Protokolle zu lesen. Bitte beachten Sie, dass das Format der Nachricht abhängig von Ihrer Version unterschiedlich sein kann. Dieser Code funktioniert in 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; 
+0

Endlich zur Verwendung dieses Codes & haben 1 Frage, Sean. Das funktioniert so, wie ich es will! Vielen Dank! Ich habe mich jedoch dafür entschieden, das "LogDate" in ein "Mon, day year time" Format zu bringen, ähnlich wie das Feld "StartDateTime" formatiert ist. Irgendwelche Vorschläge? Danke! –

+0

Ich habe eine formatierte Datumsspalte in der Ergebnismenge hinzugefügt. –

+0

Danke, Sean. Was komisch ist, ich dachte, ich hätte genau das getan, was du getan hast, um das Datum zu formatieren. Ich war auf dem richtigen Weg, habe aber aus irgendeinem Grund ein falsches Datum für das "FormattedLogDate" erhalten. Dies traf den Nagel auf den Kopf! Vorwärts gehen. –