我写了下面的 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 数据库只有两个数据库文件(数据库和日志),但可以有更多(数据库可以拆分为多个文件)。
逻辑名称通常是这样的:
DatabaseName
或DatabaseName_Data
表示数据库文件- 日志文件的
DatabaseName_Log
...但不幸的是您不能依赖它,因为您可以为文件指定任何您想要的名称。
如果您确实想以通用方式编写此脚本,并且您有多个数据库,那么这是确保所有数据库具有相同数量的数据库文件并且逻辑名称全部匹配相同模式的最简单方法(例如,DatabaseName_Data
和 DatabaseName_Log
)。
如果不这样做,则必须动态获取数据库文件的数量及其逻辑名称,这将使 SP 变得更加复杂。
关于sql - 写入备份和恢复数据库的过程出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119170/