0

我正在设置一个 SQL 脚本,该脚本从变量名创建数据库,然后获取新创建的数据库并从 .bak 文件中恢复它。我在设置的一个命令中遇到了一些语法问题,想问是否有人可以帮助我发现我的语法错误?我只会粘贴我麻烦的代码片段及其声明,如果我是正确的,问题在于我声明文件名路径的方式。我尝试设置变量的路径,但由于撇号放置,我仍然收到错误。谢谢!!!

declare @DBname varchar(10), @sqlcommand Nvarchar(max)
set @DBname = 'testdb'

创建数据库的代码,并将新数据库设置为单用户模式

--restore database
set @sqlcommand = N'Restore DATAbase ' + @DBname + ' from disk = ''C:/loc_smartz_db0_template.bak'' with move ' 
+ @DBname + ' to ''C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.mdf'', move ' +     @DBname + ' to ''C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.ldf'', Replace'
EXECUTE sp_executesql @sqlcommand 

将数据库设置回多用户并打印数据库已成功创建的代码

4

2 回答 2

2

看起来以前的海报已经解决了您的问题,但是如果您以“最佳实践”方式使用动态 sql,则可能会避免这种情况。将字符串作为变量和字符串文字的混合连接在一起并不理想,因为它使使用撇号变得困难(如此处所示)。

更好的方法是将您的 sql 编写为

declare @DBname nvarchar(255) = 'testdb'
        ,@BakName nvarchar(255) = 'C:\loc_smartz_db0_template.bak'
        ,@MovemdfName nvarchar(255) = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDatabase1.mdf'
        ,@MoveldfName nvarchar(255) = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDatabase1.ldf'
        ,@sqlcommand nvarchar(max)
        ,@paramList nvarchar(max)

set @paramList = '@DBname nvarchar(255), @BakName nvarchar(255), @MovemdfName nvarchar(255), @MoveldfName nvarchar(255)'
set @sqlcommand = N'Restore DATAbase @DBname from disk = @BakName with move @DBname to @MovemdfName, move @DBname to @MoveldfName, Replace'

exec sp_executesql @statement = @sqlcommand
                  ,@params = @paramList
                  ,@DBname = @DBname
                  ,@BakName = @BakName 
                  ,@MovemdfName  = @MovemdfName 
                  ,@MoveldfName = @MoveldfName 

这样,您的 sql 命令就非常易于阅读和维护。请注意,如果您的路径名中有空格,您也不必在变量值中转义撇号。

它还具有允许 SQL Server 重用将提高性能的执行计划的优点(如果您在存储过程中有代码)。

请参阅此处了解更多信息。

于 2012-07-26T00:39:19.667 回答
1

两件事情。

首先,您必须在数据库文件逻辑名称周围加上单引号,例如

...with move testdb to 'C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.mdf'

...with move 'testdb' to 'C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.mdf'

进行中

set @sqlcommand = N'Restore DATAbase ' + @DBname + ' from disk = ''C:\loc_smartz_db0_template.bak'' with move ''' 
 + @DBname + ''' to ''C:\ProgramFiles\Microsoft SQL Server\MSSQL\Data\TestDatabase1.mdf'', move '''
 + @DBname + ''' to ''C:\ProgramFiles\Microsoft SQL Server\MSSQL\Data\TestDatabase1.ldf'', Replace'

其次,使用反斜杠\,而不是斜杠。(也许这有效,但在我的快速测试中没有。)

于 2012-07-25T23:00:07.207 回答