2017-09-26 240 views
0

我試圖使用當前日期時間備份數據庫以創建唯一文件名。使用當前日期備份SQL Server數據庫

我不斷收到不正確的語法上的「+」 @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 

而且我找不出什麼搜索一下,就知道我在做什麼錯?

回答

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' 

全部soution :

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 
+0

是的,我發現了,真的很好的答案!所以我所需要的只是讓一個@location變量保存在? – andrelange91

+0

是的,您可以在調用備份命令之前構建位置,它會很高興。 – Tanner

+1

另外,請注意'REPLACE'用於刪除時間的':'字符。 – Tanner

0

你需要使用動態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 ['[email protected]+'] 
TO DISK = ''C:\SQLEXPRESSBACKUP\DB'[email protected]+'.bak'' 
WITH NOFORMAT, INIT, NAME= '''[email protected]+''', SKIP, NOREWIND, NOUNLOAD, STATS=10'; 
     PRINT @sql; 
--exec (@sql) 
    END; 

PRINT @SQL會告訴你什麼是將要運行,如果你喜歡它然後刪除並取消註釋exec (@sql)

+0

我得到這個錯誤,當我嘗試執行該過程時,:關鍵字'與'附近的語法不正確。如果此語句是公用表表達式,xmlnamespaces子句或變更跟蹤上下文子句,則前面的語句必須以分號結尾。 – andrelange91

+0

@ andrelange91我的壞 - 不小心加了一個額外的報價,改變了它 – dbajtr

1

您可以聲明變量@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 
+0

這工作^^謝謝。 – andrelange91

+0

@ andrelange91這個代碼實際上是否與'GETDATE()'生成的':'字符一起工作,它沒有在我測試它的時候,這就是我在我的解決方案中替換它們的原因。 – Tanner

+0

不,它不適用於:,但所有其他工作。我以前甚至都沒有意識到這是一個問題。 – andrelange91

相關問題