【问题标题】:Incremental control field - Cursor增量控制字段 - 光标
【发布时间】:2017-10-25 04:10:16
【问题描述】:

我正在尝试创建一个简单的恢复游标,当我需要恢复多个数据库时将使用它。

每个数据库都有简单的恢复模型,并且都使用以下格式命名:DBname_AAAAMMDD_FULL

我想出了一个动态脚本,它可以一次性完成这项工作,但它不会增加光标上的数据字段。

这是我迄今为止尝试过的:

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 

【问题讨论】:

    标签: sql-server ssms sql-server-2014


    【解决方案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 
    

    到目前为止,我得到了以下信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2012-12-15
      • 2010-11-20
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多