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

标签 sql sql-server t-sql

我写了下面的 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 Incorrect syntax near '+'.

最佳答案

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

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

select name, filename from sysfiles

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

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

  • DatabaseNameDatabaseName_Data 表示数据库文件
  • 日志文件的DatabaseName_Log

...但不幸的是您不能依赖它,因为您可以为文件指定任何您想要的名称。

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

关于sql - 写入备份和恢复数据库的过程出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119170/

相关文章:

sql - 您将如何使用 SQL 或 R 库 sqldf 执行此任务?

sql - 填写表中缺失的天数

sql - 如何根据 SQL Server 表中给定的 Id 在链中查找子、父及其子和父

sql - 在日期范围内查找匹配值并返回值

sql-server - SSMS 搜索数据库名称?

sql - UPDATE 命令 SET @return = [int_a] = [int_a] + auto_increment WHERE <子句​​>

sql - 我的 SQL Server 存储过程中的 BIT 值类型存在语法问题

java - HIbernate 标准别名未加入

SQL Server - 如何使用具有重复空列的分组集

sql - T-SQL 按另一个表中的父键进行分组