2016-04-13 9 views
1

からrundurationを取得します。T-SQL - 私は3列を引っ張って以下のコードを使用していリストアジョブ

  • サーバー名
  • データベース名
  • 日付/時刻
を開始した復元

コード:私が何をしたいのですがどのような

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()) 

は0を取得していますはmsdb..sysjobhistoryテーブルで結ばれています。私の人生のために、上のコードでそのテーブルをどのように結びつけるのか見ていけません。私は、私が探している情報を得る方法についてラウンドがあると確信しています。

提案がありますか?

ありがとうございます!

答えて

2

復元の終了日時は、SQL Serverログに記録されます。 xp_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; 
+0

最後に、このコードを使用して&Seanに関する1つの質問があります。 これは私がそれをどのようにしたいかについてちょうどうまくいきます!ありがとう!私は、 "LogDate"を "StartDateTime"フィールドがどのようにフォーマットされているかに似て、 "Mon、day year time"形式にしようとしています。 提案がありますか? ありがとう! –

+0

結果セットにフォーマットされた日付列を追加しました。 –

+0

ありがとう、Sean。面白いのは、あなたが書式設定された日付を得るためにあなたがやったことをやったと思っています。私は正しい軌道に乗っていたが、何らかの理由で「FormattedLogDate」の日付が間違っていた。 これは頭の爪に当たった!前進する。 –

関連する問題