Ошибка с процедурой, написанной для резервного копирования и восстановления БД - PullRequest
2 голосов
/ 19 августа 2011

Я написал ниже 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;

Сообщение об ошибке:

Сообщение 102, уровень 15, состояние 1, процедура CopyDB, строка 13 Неправильный синтаксис рядом с '+ '.

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

Ошибка в вашем скрипте в предложении MOVE.
Вы должны использовать логические имена файлов вашей базы данных (по одному MOVE для каждого логического имени) вместо @DBName каждый раз.

Вы можете получить логические имена файлов, выполнив следующий запрос к вашей базе данных:

select name, filename from sysfiles

name - логическое имя файла базы данных.
filename находится сейчас на диске.

По умолчанию базы данных SQL Server имеют только два файла базы данных (база данных и журнал), но их может быть больше (база данных может быть разбита на несколько файлов).
Логические имена часто бывают такими:

  • DatabaseName или DatabaseName_Data для файла базы данных
  • DatabaseName_Log для файла журнала

... но, к сожалению, вы не можете полагаться на это, потому что вы можете дать файлам любое имя, какое захотите.

Если вы действительно хотите написать это в общем виде и у вас есть более одной базы данных, это самый простой способ убедиться, что все базы данных имеют одинаковое количество файлов базы данных и что все логические имена соответствуют одному и тому же шаблону ( например DatabaseName_Data и DatabaseName_Log).
Если вы этого не сделаете, вы должны получить количество файлов базы данных и их логические имена на лету, что сделает SP более сложным.

2 голосов
/ 19 августа 2011

Попробуйте это

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...