2011-05-19 93 views
0

当我执行以下脚本时,出现以下错误。我应该怎么做才能纠正这个问题?Sql脚本 - 错误的语法错误

错误

Msg 102, Level 15, State 1, Line 9 
Incorrect syntax near '@path'. 

脚本

GO 
declare @path varchar(2000) 
declare @path1 varchar(2000) 
select @path=(SELECT [filename] FROM master..sysdatabases WHERE [name] LIKE 'master') 
set @path= REPLACE(@path, 'master', 'test') 
set @path1= REPLACE(@path, 'test.mdf', 'test_log.ldf') 
select @path 
select @path1 
CREATE DATABASE [test] ON 
(FILENAME = @path), 
(FILENAME =N'D:\Program Files (x86)\Microsoft SQL Server\MSSQL.3\MSSQL\DATA\test_log.ldf') 
FOR ATTACH 
GO 
+1

这试图读取'master'数据库的位置**不**必须与配置的默认数据路径相同(它不是我的任何一个机器,例如) – 2011-05-19 07:50:37

回答

3

更换

CREATE DATABASE [test] ON 
(FILENAME = @path), 
(FILENAME =N'D:\Program Files (x86)\Microsoft SQL Server\MSSQL.3\MSSQL\DATA\test_log.ldf') 
FOR ATTACH 

DECLARE @sql nvarchar(400); 
SET @sql = ' 
CREATE DATABASE [test] ON 
(FILENAME = ' + quotename(@path,'''') + '), 
(FILENAME =N' + quotename(@path1,'''') + ') 
FOR ATTACH 
' 
EXECUTE sp_executesql @sql; 
+0

我的目标是将mdf和ldf文件复制到sql server安装文件夹,然后创建数据库。这是正确的方法吗?我应该对脚本进行任何更改吗? – Maanu 2011-05-19 07:43:27

+0

我将使用链接到的文章@marc_s中引用的路径。这是否是为了更“产品风格”的部署,在您不需要提前知道服务器信息的情况下分发数据库,​​还是需要1个进程部署到dev/QA/UAT的“内部样式”部署/生产?一般来说,主数据库的路径不会有任何虚假(注入)值,但在连接和执行之前检查值总是一个好主意。 – 2011-05-19 07:58:10

1

你不是真的阅读配置的默认数据目录 - 你只是读,其中master数据库所在的目录(和不必为数据文件配置的默认目录) 。

如果你真的想知道真正的目录 - 你需要查看注册表。看到这blog post here at SQL Server Central所有血淋淋的详细信息...