我想创建一个创建数据库的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.
我知道问题是我没有为文件名指定完全限定的路径。但我想能够运行此脚本,无论数据库服务器的目录结构如何。有没有办法使用默认路径?
答案 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
来切换数据库,则局部变量作用域将丢失。因此,如果要在脚本中创建多个数据库,则可以在开始时全部创建它们,或者将变量的声明/设置复制到每个创建中。