0

我正在设置一种在内部环境中创建和删除备份的新方法。服务器上的空间是一个大问题,所以我真的必须找到一种方法来进行备份并从程序上删除每个数据库的旧版本。

我想出了使用 sp_MSforeachdb 的想法并简单地进行备份。成功后,它将删除前一天完成的旧备份。(我们每晚进行 1 次备份)。

DECLARE @DBOPurpose Varchar(15)
DECLARE @Drive      Varchar(1)
Set @DBOPurpose = 'Omnilabs'

DECLARE @command varchar(Max) 

Select @command = '

If Exists (Select * 
            from sys.databases 
            where name like ''%?'' 
            and name like ''%'+@DBOPurpose+'%'')

BEGIN
EXECUTE master.dbo.xp_create_Subdir '+@Drive+':\SQLBACKUP\'+@DBOPurpose+'
GO

BACKUP DATABASE [?] TO DISK = '+@Drive+':\SQLBackup\'+@DBOPurpose+'_Select Cast(Cast(Year(Getdate())As Varchar(150))+''_''+Cast(month(Getdate())As Varchar(150))+''_''+Cast (Day(Getdate()) As Varchar(150))+''_''+ cast(DATEPART(hour, GETDATE()) as varchar) + '''' + cast(DATEPART(minute, GETDATE()) as varchar)+ '''' + cast(DATEPART(Second, GETDATE()) as varchar)+ ''.bak'' As varchar(150))


END

Print N''TEST''
'
--Select @Command
EXEC sp_MSforeachdb @command 

我期待做Select @Command实际上会向我展示一些东西,但它是无效的。当我运行它时,它只是写“命令已成功完成”。一秒钟之内,这没有任何意义。

4

1 回答 1

0

刚刚看到我的错误,这只是由未正确放置的连字符引起的。这是代码:

If exists(Select * from #TempDBName where DBNAME = @DBOPurpose)
BEGIN
    DECLARE @ERROR bit
    DECLARE @command nvarchar(Max)
    SET @Error = 0
    SET @command = '



    DECLARE @DBO VARCHAR(15)
    Set @DBO = ''%'+@DBOPURPOSE+'%''

    If Exists (Select * 
                    from sys.databases 
                    where name like ''%?'' 
                    and name like ''%''+@DBO+''%'')
            BEGIN TRY

                    PRINT ''?''

                    EXECUTE master.dbo.xp_create_Subdir '''+@Drive+':\SQLBACKUP\TEST\?''
                    BACKUP DATABASE [?] TO DISK = '''+@Drive+':\SQLBackup\'+@DBOPurpose+'_' +(Cast(Cast(Year(Getdate())As Varchar(150))+'_'+Cast(month(Getdate())As Varchar(150))+'_'+Cast (Day(Getdate()) As Varchar(150))+'_'+ cast(DATEPART(hour, GETDATE()) as varchar) + cast(DATEPART(minute, GETDATE()) as varchar)+ cast(DATEPART(Second, GETDATE()) as varchar)+ '.bak''' As varchar(150)))+'

            END TRY

            BEGIN CATCH
            Insert into BackupExecLog(ErrorDate, ErrorNumber, ErrorMessage)
                Select Getdate(),
                    ERROR_NUMBER() as ErrorNumber,
                    ERROR_MESSAGE() as ErrorMessage

                    Set @Error = 1
            END CATCH'


        Select @Command
    --EXEC sys.sp_MSforeachdb @command 
于 2019-05-23T19:36:40.573 回答