Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为备份和恢复数据库而编写的过程出错_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 为备份和恢复数据库而编写的过程出错

Sql 为备份和恢复数据库而编写的过程出错,sql,sql-server,tsql,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 CHECKS

我已经写了下面的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,15级,状态1,过程CopyDB,第13行“+”附近语法不正确

试试这个

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
select name, filename from sysfiles
在我的例子中,您可以看到@DBName最后有_数据或_日志。我认为您需要执行相同的操作或自动生成脚本


脚本中的错误出现在
MOVE
子句中。
每次都必须使用数据库文件的逻辑名称(每个逻辑名称对应一个
MOVE
),而不是
@DBName

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

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
select name, filename from sysfiles
name
是数据库文件的逻辑名称。
filename
是它现在在磁盘上的位置

默认情况下,SQL Server数据库只有两个数据库文件(数据库和日志),但可以有更多(数据库可以拆分为多个文件)。
逻辑名称通常如下所示:

  • 数据库文件的
    DatabaseName
    DatabaseName\u Data
  • 日志文件的
    DatabaseName\u Log
…但不幸的是,你不能依赖它,因为你可以给文件取任何你想要的名字

如果您确实希望以通用方式编写此脚本,并且您有多个数据库,那么最简单的方法是确保所有数据库都具有相同数量的数据库文件,并且逻辑名称都匹配相同的模式(例如
DatabaseName\u Data
DatabaseName\u Log


如果不这样做,则必须动态获取数据库文件的数量及其逻辑名称,这将使SP更加复杂。

我遇到以下错误。为数据库“Amrutha”和文件1上的文件“Amrutha”处理了168页。已处理文件1上数据库“Amrutha”和文件“Amrutha_log”的1页。备份数据库在0.213秒(6.198 MB/秒)内成功处理了169页。Msg 4353,16级,状态1,过程CDB,第15行冲突文件重新定位已为文件“Amrutha”指定。对于任何逻辑文件名,只应指定一个WITH MOVE子句。Msg 3013,16级,状态1,过程CDB,第15行还原数据库异常终止。我编辑了答案。我想你最好自动生成脚本。:-如何自动生成脚本。你能给我一个想法吗?我必须在另一个存储过程中执行这个任务。因此,我想到了编写存储过程。我认为,当您生成脚本时,您将能够以它为例编写SP。我编辑了答案。现在有了如何生成脚本的打印屏幕