使用默认路径中的文件创建数据库

时间:2009-10-28 14:31:25

标签: sql sql-server database

我想创建一个创建数据库的SQL脚本。现在,我有这个:

CREATE DATABASE [Documents] ON  PRIMARY 
( NAME = N'Documents', FILENAME = N'Documents.mdf')
 LOG ON 
( NAME = N'Documents_log', FILENAME = N'Documents_log.ldf')
 COLLATE SQL_Latin1_General_CP1_CI_AS

但是,这会产生以下错误:

Msg 5105, Level 16, State 2, Line 2
A file activation error occurred. The physical file name 'Documents.mdf' may be incorrect. Diagnose and correct additional errors, and retry the operation.
Msg 1802, Level 16, State 1, Line 2
CREATE DATABASE failed. Some file names listed could not be created. Check related errors.

我知道问题是我没有为文件名指定完全限定的路径。但我想能够运行此脚本,无论数据库服务器的目录结构如何。有没有办法使用默认路径?

6 个答案:

答案 0 :(得分:62)

创建数据库'Documents'并通过alter。

提供文件属性
USE [master]
GO

CREATE DATABASE [Documents]
GO

ALTER DATABASE [Documents] MODIFY FILE
( NAME = N'Documents', SIZE = 512MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
GO

ALTER DATABASE [Documents] MODIFY FILE
( NAME = N'Documents_log', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% )
GO

此脚本更具可移植性,无需任何修改即可部署在多台服务器中。

答案 1 :(得分:23)

您可以在不指定文件详细信息的情况下创建数据库,例如:

创建数据库文档;

答案 2 :(得分:3)

请参阅How do I find the data directory for a SQL Server instance?

如果您使用的是SQL Server 2012或更高版本,则可以使用

找到默认路径
select 
  InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
  InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')

然后,您可以使用exec()来构造CREATE DATABASE语句。

如果您希望数据库的物理文件名与默认名称不同,这将非常有用。

答案 3 :(得分:1)

了解如何创建Default Path。看看它对你要找的东西是否有帮助。

干杯,

答案 4 :(得分:1)

我相信你可以做到

CREATE DATABASE [Documents]

没有ON ....它将使用路径和其余的默认值创建。

答案 5 :(得分:1)

添加到@Blade的答案。这是获取默认路径服务器属性并使用EXECUTE方法的示例:

DECLARE @DefaultDataPath varchar(max)
SET @DefaultDataPath = (SELECT CONVERT(varchar(max), SERVERPROPERTY('INSTANCEDEFAULTDATAPATH')))
DECLARE @DefaultLogPath varchar(max)
SET @DefaultLogPath = (SELECT CONVERT(varchar(max), SERVERPROPERTY('INSTANCEDEFAULTLOGPATH')))

EXECUTE('
CREATE DATABASE [blah] ON PRIMARY
( NAME = N''blah'', FILENAME = ''' + @DefaultDataPath + 'blah.mdf'', SIZE = 167872KB, MAXSIZE = UNLIMITED, FILEGROWTH = 16384KB )
 LOG ON
( NAME = N''blah_Log'', FILENAME = ''' + @DefaultDataPath + 'blah_Log.mdf'', SIZE = 2048KB, MAXSIZE = 2048GB, FILEGROWTH = 16384KB );
COLLATE SQL_Latin1_General_CP1_CI_AS;
');
GO

请注意,如果您执行USE来切换数据库,则局部变量作用域将丢失。因此,如果要在脚本中创建多个数据库,则可以在开始时全部创建它们,或者将变量的声明/设置复制到每个创建中。