简体   繁体   English

写入备份和还原数据库的过程出错

[英]Error with the procedure written to Back up and restore the DB

I have written the below SP and getting below error. 我写了下面的SP,并得到以下错误。 Could any one please help me finding the error. 谁能帮助我找到错误。

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;

Error message is : 错误消息是:

Msg 102, Level 15, State 1, Procedure CopyDB, Line 13 Incorrect syntax near '+'. 消息102,级别15,状态1,过程CopyDB,行13“ +”附近的语法错误。

The error in your script is in the MOVE clause. 脚本中的错误在MOVE子句中。
You have to use the logical names of your database files (one MOVE for each logical name) instead of @DBName every time. 您必须每次使用数据库文件的逻辑名(每个逻辑名一个MOVE )而不是@DBName

You can get the logical file names by running the following query on your database: 您可以通过在数据库上运行以下查询来获取逻辑文件名:

select name, filename from sysfiles

name is the logical name of the database file. name是数据库文件的逻辑名称。
filename is where it's on the disk right now. filename是它现在在磁盘上的位置。

By default, SQL Server databases have only two database files (the database and the log), but there can be more (the database can be split in several files). 默认情况下,SQL Server数据库只有两个数据库文件(数据库和日志),但是可以更多(数据库可以拆分为多个文件)。
The logical names are often like this: 逻辑名称通常是这样的:

  • DatabaseName or DatabaseName_Data for the database file 数据库文件的DatabaseNameDatabaseName_Data
  • DatabaseName_Log for the log file 日志文件的DatabaseName_Log

...but unfortunately you can't rely on that, because you can give the files any name you want. ...但是很遗憾,您不能依靠它,因为您可以给文件起任何想要的名字。

If you really want to script this in a general way and you have more than one database, it's the easiest way to make sure that all databases have the same number of database files and that the logical names all match the same pattern (like DatabaseName_Data and DatabaseName_Log , for example). 如果您真的想以一种通用的方式编写脚本,并且有多个数据库,那么这是确保所有数据库具有相同数量的数据库文件并且逻辑名称都匹配相同模式的最简单方法(例如DatabaseName_Data和例如, DatabaseName_Log )。
If you don't do this, you have to get the number of database files and their logical names on the fly, which will make the SP much more complex. 如果不这样做,则必须即时获取数据库文件的数量及其逻辑名称,这将使SP变得更加复杂。

Try this 尝试这个

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;

Autogenerated Script for restoring of my database: 用于还原数据库的自动生成的脚本:

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

You can see that @DBName in my case have _Data or _Log in the end. 您可以看到在我的情况下,@ DBName末尾具有_Data或_Log。 I think you need to do te same or generate the script automatically. 我认为您需要执行相同操作或自动生成脚本。

在此处输入图片说明在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM