【问题标题】:Backup a SQL Server database with current date使用当前日期备份 SQL Server 数据库
【发布时间】:2017-09-26 10:44:06
【问题描述】:

我正在尝试使用当前日期时间备份数据库以创建唯一的文件名。

在@TimeDate 之前,'+' 上的语法一直不正确

我的代码:

ALTER PROCEDURE [dbo].[BackUpDatabase]
(@DatabaseName Varchar(256))
AS
Begin
DECLARE @TimeDate Varchar(256);
SET @TimeDate = CONVERT(Varchar(256),GETDATE(), 113);
BACKUP DATABASE @DatabaseName
TO DISK = 'C:\SQLEXPRESSBACKUP\DB'+ @TimeDate + '.bak'
WITH NOFORMAT, INIT, NAME= @DatabaseName, SKIP, NOREWIND, NOUNLOAD, STATS=10
END

我不知道要搜索什么,知道我做错了什么?

【问题讨论】:

    标签: sql-server datetime stored-procedures


    【解决方案1】:

    首先,看看你的@TimeDate 值生成了什么:

    DECLARE @TimeDate Varchar(256);
    SET @TimeDate = CONVERT(Varchar(256),GETDATE(), 113);
    SELECT @TimeDate
    

    生产:

    26 Sep 2017 11:49:07:650
    

    当附加到您的字符串时,这不是可接受的文件名。所以你需要清理它以删除 : 字符。

    SET @TimeDate = REPLACE(CONVERT(Varchar(256),GETDATE(), 126), ':','');
    

    其次,它不喜欢你在这里连接一个字符串,所以使用一个你可以在之前准备好的变量:

    TO DISK = 'C:\SQLEXPRESSBACKUP\DB'+ @TimeDate + '.bak'
    

    改为:

    DECLARE @location VARCHAR(100) = 'C:\SQLEXPRESSBACKUP\DB' + @timedate + '.bak'
    

    完整的解决方案:

    DECLARE @TimeDate Varchar(256);
    SET @TimeDate = REPLACE(CONVERT(Varchar(256),GETDATE(), 126), ':','');
    DECLARE @location VARCHAR(100) = 'C:\SQLEXPRESSBACKUP\DB' + @timedate + '.bak'
    BACKUP DATABASE @DatabaseName
    TO DISK = @location
    WITH NOFORMAT, INIT, NAME= @DatabaseName, SKIP, NOREWIND, NOUNLOAD, STATS=10
    

    【讨论】:

    • 是的,我发现了,非常好的答案!所以我真正需要的只是创建一个@location 变量来保存它?
    • 可以,位置可以在调用备份命令之前建好,会很开心。
    • 另外,注意REPLACE 用于从时间日期中删除: 字符。
    【解决方案2】:

    您可以声明一个变量@ExecuteQuery,然后将此变量值赋给TO DISK

    像这样。

    DECLARE @ExecuteQuery Varchar(1000);
    SET @ExecuteQuery  = 'C:\SQLEXPRESSBACKUP\DB' +  CONVERT(Varchar(256),GETDATE(), 113) + '.bak'
    BACKUP DATABASE @DatabaseName
    TO DISK = @ExecuteQuery 
    WITH NOFORMAT, INIT, NAME= @DatabaseName, SKIP, NOREWIND, NOUNLOAD, STATS=10
    

    【讨论】:

    • @andrelange91 这段代码是否真的适用于:GETDATE() 生成的字符,当我测试它时它没有,这就是我在我的解决方案中替换它们的原因。
    • 不,它不适用于 :,但所有其他都有效。以前我什至没有意识到,这是个问题。
    【解决方案3】:

    您需要使用动态 SQL 来构建查询,而不是尝试添加变量:

    ALTER PROCEDURE [dbo].[BackUpDatabase](@DatabaseName VARCHAR(256))
    AS
         BEGIN
             DECLARE @TimeDate VARCHAR(256);
             SET @TimeDate = CONVERT(VARCHAR(256), GETDATE(), 113);
             DECLARE @sql VARCHAR(MAX);
             SET @sql = '
    BACKUP DATABASE ['+@DatabaseName+']
    TO DISK = ''C:\SQLEXPRESSBACKUP\DB'+@TimeDate+'.bak''
    WITH NOFORMAT, INIT, NAME= '''+@DatabaseName+''', SKIP, NOREWIND, NOUNLOAD, STATS=10';
             PRINT @sql;
    --exec (@sql)
         END;
    

    PRINT @SQL 将向您展示将要运行的内容,如果您对它感到满意,则将其删除并取消注释掉 exec (@sql)

    【讨论】:

    • 我收到此错误,当我尝试执行该过程时:关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。
    • @andrelange91 我的错 - 意外添加了一个额外的引用,改变了它
    猜你喜欢
    • 2018-07-10
    • 2020-10-21
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多