更改SQL Server数据库文件位置的脚本

3
我需要更改实例中数据库的所有文件位置。基本上,由于当前目录的空间限制,我需要将实例移动到同一服务器上的新位置。文件将全部移动到相同的新位置,并且名称将保持不变。因此,只需要更改路径。(听起来很简单,但我无法让它工作,这真是令人沮丧。:-) )
我正在尝试使用sp_MSForEachDB,但似乎无法正确使用引号将新文件位置传递到ALTER DATABASE命令的FILENAME =参数中。
以下是我目前拥有的:
DECLARE @command NVARCHAR(1000)--, @filename NVARCHAR(100)

SELECT @command = '
BEGIN
DECLARE @filename nvarchar(100)
USE ?
SELECT @filename = 
    "F:\DevworxExtStorage\Databases\MSSQL12.DEVSQL2014\MSSQL\DATA\" + ? + ".mdf"

ALTER DATABASE ? MODIFY FILE ( NAME = ?, FILENAME = 
"F:\DevworxExtStorage\Databases\MSSQL12.DEVSQL2014\MSSQL\DATA\") 

SELECT @filename = 
"F:\DevworxExtStorage\Databases\MSSQL12.DEVSQL2014\MSSQL\DATA\" + ? + "_log.ldf"
ALTER DATABASE ?_log MODIFY FILE ( NAME = ?, FILENAME = @filename) 


END'

exec sp_MSforeachdb @command

SELECT @command = 'ALTER DATABASE ? SET offline'
exec sp_MSforeachdb @command

我遇到了问题:

错误消息102,级别15,状态1,第10行“@filename”附近的语法不正确。

这是一个开发数据库实例,因此升起和关闭它并不是问题。我更喜欢这个方法,而不是备份/恢复,因为它只需要几秒钟就可以完成,而不是几分钟。 我们将来还会多次使用它,因此将其制作成脚本非常重要。我知道手动执行脚本的步骤是有效的。

我只需要帮助调试脚本,我认为这可能是引号出现问题的原因。提前感谢您的任何帮助!

1个回答

1
你需要稍微改一下引号:

你必须稍微改一下引号:

DECLARE @command NVARCHAR(1000)--, @filename NVARCHAR(100)

SELECT @command = '
BEGIN
DECLARE @filename nvarchar(256)
USE ?
SELECT @filename = 
    ''F:\DevworxExtStorage\Databases\MSSQL12.DEVSQL2014\MSSQL\DATA\'' + DB_NAME() + ''.md''
END 

SELECT @filename
    '
exec sp_MSforeachdb @command

使用单引号表示字符串,使用两个单引号来转义一个单引号。


谢谢,这让我开始并进行了一些修改后成功了。因为 ALTER DATABASE / MODIFY 需要在文件名周围使用双引号,所以我必须使用以下内容进行选择:SELECT @filename = ''"F\DevworxExtStorage\Databases\MSSQL12.DEVSQL2014\MSSQL\DATA'' + DB_NAME() + ''.mdf"' 请注意文字的开头是单引号单引号双引号,然后文字结尾是双引号单引号单引号。 - Nelda.techspiress

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接