写入备份和恢复数据库的过程出错

时间:2011-08-19 08:54:07

标签: sql sql-server tsql

我写了下面的SP并得到以下错误。任何人都可以帮我找到错误。

create procedure CopyDB(@DBName varchar(100),@Newname varchar(100))
as
DECLARE @FileName AS nvarchar(4000)
set @FileName = 'D:\'+@DBName+'.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\'+@Newname+'.mdf',
MOVE @DBName TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\'+@Newname+'_log.LDF',
CHECKSUM;

错误信息是:

  

Msg 102,Level 15,State 1,Procedure CopyDB,Line 13'+'附近的语法不正确。

2 个答案:

答案 0 :(得分:3)

脚本中的错误位于MOVE子句中 您必须使用数据库文件的逻辑名称(每个逻辑名称一个MOVE),而不是每次都使用@DBName

您可以通过在数据库上运行以下查询来获取逻辑文件名:

select name, filename from sysfiles

name是数据库文件的逻辑名称 filename就是它现在在磁盘上的位置。

默认情况下,SQL Server数据库只有两个数据库文件(数据库和日志),但可以有更多(数据库可以分成几个文件)。
逻辑名称通常是这样的:

    数据库文件
  • DatabaseNameDatabaseName_Data
  • DatabaseName_Log用于日志文件

...但不幸的是你不能依赖它,因为你可以给文件任意名称。

如果您真的想以一般方式编写脚本并且您有多个数据库,那么这是确保所有数据库具有相同数量的数据库文件并且逻辑名称都匹配相同模式的最简单方法(例如,DatabaseName_DataDatabaseName_Log 如果不这样做,则必须动态获取数据库文件及其逻辑名称的数量,这将使SP更加复杂。

答案 1 :(得分: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\'+@Newname+'.mdf'
SET @varPathLdf='C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\'+@Newname+'_log.LDF'
SET @FileName = 'D:\'+@DBName+'.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