2017-10-25 7 views
1

複数のデータベースを復元する必要がある場合に使用される単純な復元カーソルを作成しようとしています。インクリメンタルコントロールフィールド - カーソル

各データベースは、単純復旧モデルを持っているし、すべては次の形式を使用して命名されていますDBname_AAAAMMDD_FULL

私は、単一のistanceのために仕事をする動的なスクリプトを思い付いているが、それは上のデータフィールドをインクリメントしていません私のカーソル。

DECLARE @SQL VARCHAR(MAX) 
DECLARE @DATE DATETIME = '20170926' 
DECLARE @DATE_CHAR CHAR(9) = CONVERT(CHAR(9),@DATE,112) 
DECLARE @DBName VARCHAR(MAX) = 'MyDB_' 
DECLARE @DBFileName VARCHAR(MAX) 
SELECT @DBNAME = (@DBNAME + @DATE_CHAR) 
SELECT @DBName 
SELECT @DBFileName = ('' + @DBNAME+'' +'_FULL_FRM.BAK') --This should match the physical file name 
SELECT @DBFILENAME 

WHILE (SELECT @DATE) <= '20170930' 
BEGIN 
    PRINT @DATE 
    SET @DATE = (@DATE +1) 
    IF (SELECT @DATE) > '20170930' 
     BREAK 
    ELSE 
     CONTINUE 
END 

とコードのこの部分が、動作するようにいずれかを持っていない:ここでは

は、私がこれまで試してみましたものです。

DECLARE @SQL VARCHAR(MAX) 
DECLARE @DATE DATETIME = '20170926' 
DECLARE @DATE2 DATETIME 
DECLARE @DATE_CHAR CHAR(9) = CONVERT(CHAR(9),@DATE,112) 
DECLARE @DBName VARCHAR(MAX) = 'MYDB_' 
DECLARE @DBFileName VARCHAR(MAX) 
SELECT @DBNAME = (@DBNAME + @DATE_CHAR) 
--23 = aaaa-mm-dd 
--112 = aaaammdd 
SELECT @DBName 
SELECT @DBFileName = ('' + @DBNAME+'' +'_FULL_FRM.BAK') --This should tch the physical file name 
SELECT @DBFILENAME 

DECLARE Employee_Cursor CURSOR FOR 
SELECT @DATE 
WHERE @DATE < '20170930' 
OPEN Employee_Cursor; 
FETCH NEXT FROM Employee_Cursor; 
WHILE @DATE <= '20170930' 
    BEGIN 
    SELECT @DATE = @DATE+1 
    PRINT @DATE 
     FETCH NEXT FROM Employee_Cursor; 
    END; 
CLOSE Employee_Cursor; 
DEALLOCATE Employee_Cursor; 
GO 

答えて

1

は、カーソルを使用せずに、GarethDと彼の有用な情報のおかげでここに提供、動作するように私のクエリを得た:While loop in SQL Server 2008 iterating through a date-range and then INSERT

私は何を必要とすることは、私が得ることができるので、1日の日付を増加させたループでした私たちのバックアップの正しい名前。このクエリは最適化されていない可能性がありますが、動作します。

それはまだWIPだと、今のように役に立たないですが、私は明日終了します:

DECLARE @SQL VARCHAR(8000) 
DECLARE @DATE DATETIME = '20170926' 
DECLARE @TARGET_DATE DATETIME = '20171001' 
DECLARE @CURRENTDATE DATETIME = @DATE 
DECLARE @DATE_CHAR CHAR(9) 
DECLARE @DBName VARCHAR(255) = 'MyDB_' 
DECLARE @DBFileName VARCHAR(255) 
DECLARE @DB_PATH VARCAR(8000) 

SET @CurrentDate = @Date 


WHILE (@DATE < @TARGET_DATE) 
BEGIN 
     BEGIN 
      SET @DBName = 'MyDB_' 
      SET @DATE = (@DATE +1) 
      SET @DATE_CHAR = CONVERT(CHAR(9),@DATE,112) 
      SELECT @DBNAME = (@DBNAME + @DATE_CHAR) 
      SELECT @DBFileName = (@DBNAME +'_FULL_FRM.BAK') --This should match the physical file name 
      SELECT @SQL = 'USE ''[master]'' RESTORE DATABASE ' + @DBNAME + 'FROM DISK ''D:\BKP_PATH\' + @DBFileName + 'WITH FILE =1 ' 
     END 

SELECT @SQL 
END 
GO 

ここで私はこれまで持っているもの: results