Fully automated SQL Server Restore

前端 未结 10 1380
予麋鹿
予麋鹿 2020-12-07 16:58

I\'m not very fluent with SQL Server commands.

I need a script to restore a database from a .bak file and move the logical_data and logical_log files to a specific p

10条回答
  •  借酒劲吻你
    2020-12-07 17:22

    None of the versions include SQL 2000. This will work on all of them:

    use master
    
    --
    -- check SQL Server version
    DECLARE @sql_ver int;
    CREATE TABLE #tmp_sql_ver
    (
        [Index] int,
        [Name]  nvarchar(100),
        [iVal]  int,
        [cVal]  nvarchar(100)
    )
    INSERT INTO #tmp_sql_ver EXEC('xp_msver ProductVersion');
    IF (SELECT cast(cVal as char(2)) FROM #tmp_sql_ver) = '8.'
        SET @sql_ver = 8;
    ELSE
        SET @sql_ver = 9;
    DROP TABLE #tmp_sql_ver;
    
    --
    -- get mdf/ldf names
    DECLARE @mdf_name varchar(50)
    DECLARE @ldf_name varchar(50)
    DECLARE @RestoreFileListOnly_columns varchar(2000)
    
    IF (@sql_ver = 8)
    BEGIN
        SET @RestoreFileListOnly_columns = '
            LogicalName     nvarchar(128),
            PhysicalName    nvarchar(260),
            [Type]  char(1),
            FileGroupName   nvarchar(128),
            [Size]  numeric(20,0),
            [MaxSize]   numeric(20,0),
        '
    END
    ELSE
    BEGIN
        SET @RestoreFileListOnly_columns = '
            LogicalName     nvarchar(128),
            PhysicalName    nvarchar(260),
            [Type]  char(1),
            FileGroupName   nvarchar(128),
            [Size]  numeric(20,0),
            [MaxSize]   numeric(20,0),
    
            FileID  bigint,
            CreateLSN   numeric(25,0),
            DropLSN     numeric(25,0) NULL,
            UniqueID    uniqueidentifier,
            ReadOnlyLSN     numeric(25,0) NULL,
            ReadWriteLSN    numeric(25,0) NULL,
            BackupSizeInBytes   bigint,
            SourceBlockSize     int,
            FileGroupID     int,
            LogGroupGUID    uniqueidentifier NULL,
            DifferentialBaseLSN     numeric(25,0) NULL,
            DifferentialBaseGUID    uniqueidentifier,
            IsReadOnly  bit,
            IsPresent   bit
        '
        DECLARE @tmp_ver NVARCHAR(20)
        SELECT @tmp_ver = CAST(SERVERPROPERTY ('PRODUCTVERSION') AS NVARCHAR)
        IF @tmp_ver LIKE '1[01].%' 
            BEGIN
                SET @RestoreFileListOnly_columns = @RestoreFileListOnly_columns + ', TDEThumbpr DECIMAL'
            END
    END
    IF EXISTS (SELECT [table_name] FROM information_schema.tables WHERE [table_name] = 'tmp_RestoreFileListOnly')
    BEGIN
        DROP TABLE [tmp_RestoreFileListOnly];
    END
    EXEC ('CREATE TABLE tmp_RestoreFileListOnly ('+@RestoreFileListOnly_columns+');');
    
    INSERT INTO tmp_RestoreFileListOnly EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @bkpfile + '''')
    PRINT 'RESTORE FILELISTONLY FROM DISK = ''' + @bkpfile + ''''
    --IF @@ROWCOUNT <> 2 RETURN
    SELECT @mdf_name = LogicalName FROM tmp_RestoreFileListOnly WHERE Type = 'D'
    SELECT @ldf_name = LogicalName FROM tmp_RestoreFileListOnly WHERE Type = 'L'
    DROP TABLE tmp_RestoreFileListOnly
    

提交回复
热议问题