2011-08-19 67 views
2

我已經寫了下面的SP並獲得以下錯誤。任何人都可以幫我找到錯誤。錯誤書面的程序來備份和恢復數據庫

create procedure CopyDB(@DBName varchar(100),@Newname varchar(100)) 
as 
DECLARE @FileName AS nvarchar(4000) 
set @FileName = 'D:\'[email protected]+'.bak' 
/*Backup the database*/ 
BACKUP DATABASE @DBName 
TO DISK = @FileName 
WITH CHECKSUM, INIT; 
/*to restore it with new name*/ 
RESTORE database @Newname 
FROM DISK = @FileName 
with 
MOVE @DBName TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\'[email protected]+'.mdf', 
MOVE @DBName TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\'[email protected]+'_log.LDF', 
CHECKSUM; 

錯誤信息是:

消息102,級別15,狀態1,過程COPYDB,線13附近 '+' 不正確的語法。

回答

2

試試這個

CREATE PROCEDURE CopyDB(@DBName varchar(100),@Newname varchar(100)) 
as 
DECLARE @FileName AS nvarchar(4000) 
DECLARE @varPathMdf varchar(200),@varPathLdf varchar(200) 
SET @varPathMdf='C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\'[email protected]+'.mdf' 
SET @varPathLdf='C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\'[email protected]+'_log.LDF' 
SET @FileName = 'D:\'[email protected]+'.bak' 
/*Backup the database*/ 
BACKUP DATABASE @DBName 
TO DISK = @FileName 
WITH CHECKSUM, INIT; 
/*to restore it with new name*/ 
RESTORE database @Newname 
FROM DISK = @FileName 
with 
MOVE @DBName TO @varPathMdf, 
MOVE @DBName TO @varPathLdf, 
CHECKSUM; 

自動生成的腳本爲我的數據庫的恢復:

RESTORE DATABASE [1] FILE = N'Analytics_Data' 
FROM DISK = N'E:\DatabaseBackups\analytics.bak' 
WITH FILE = 1, 
MOVE N'Analytics_Data' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\1.mdf', 
MOVE N'Analytics_Log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\1_0.ldf', 
NOUNLOAD, STATS = 10 
GO 

你可以看到在我的情況下@DbName有_Data或_log到底。我認爲你需要做同樣的事情或自動生成腳本。

enter image description here enter image description here

+0

我有以下錯誤。在數據庫'Amrutha'上處理168頁,在文件1上處理'Amrutha'。在數據庫'Amrutha'處處理1頁,在文件1上處理'Amrutha_log'。BACKUP DATABASE在0.213秒(6.198 MB /秒)中成功處理了169頁。 Msg 4353,Level 16,State 1,Procedure CDB,Line 15文件'Amrutha'指定了衝突文件重定位。應該爲任何邏輯文件名稱指定一個WITH MOVE子句。消息3013,級別16,狀態1,過程CDB,行15 RESTORE DATABASE異常終止。 – Shine

+0

我編輯了答案。我想你最好自動生成腳本。 –

+0

: - 我如何自動生成。你能否給我一個想法去做。 – Shine

3

在你的腳本錯誤是MOVE子句。
你必須使用你的數據庫文件(一個MOVE每個邏輯名稱)的邏輯名稱,而不是每次都@DBName

您可以通過在數據庫上運行下面的查詢得到的邏輯文件名:

select name, filename from sysfiles 

name是數據庫文件的邏輯名稱。
filename就是它在磁盤上現在。

默認情況下,SQL Server數據庫只有兩個數據庫文件(數據庫和日誌),但可以有更多的(數據庫可以在幾個文件中被分割)。
邏輯名稱往往是這樣的:

  • DatabaseNameDatabaseName_Data數據庫文件
  • DatabaseName_Log日誌文件

...但不幸的是,你不能依賴於,因爲你可以給文件任何你想要的名字。

如果您確實想要以通用的方式編寫腳本並且擁有多個數據庫,那麼確保所有數據庫具有相同數量的數據庫文件並且邏輯名稱都匹配相同模式的最簡單方法(像DatabaseName_DataDatabaseName_Log,例如)。
如果你不這樣做,你必須動態地獲取數據庫文件的數量和它們的邏輯名稱,這將使SP變得更加複雜。