SQL Server 使用 SQL 语句创建数据库

在 SQL Server 中,可以使用 CREATE DATABASE 语句来创建新数据库。以下是创建数据库的基本语法和一些示例。

基本语法

sql

CREATE DATABASE database_name
[ ON
  [ PRIMARY ] 
  ( NAME = logical_file_name ,
    FILENAME = 'os_file_name' ,
    [ , SIZE = size [ KB | MB | GB | TB ] ]
    [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]
    [ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]
  ) [ ,...n ]
]
[ LOG ON 
  ( NAME = logical_file_name ,
    FILENAME = 'os_file_name' ,
    [ , SIZE = size [ KB | MB | GB | TB ] ]
    [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]
    [ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]
  ) [ ,...n ]
]
[ COLLATE collation_name ]

简单示例

1. 创建最简单的数据库

sql

CREATE DATABASE MyDatabase;

2. 创建数据库并指定文件属性

sql

CREATE DATABASE SalesDB
ON 
( NAME = SalesDB_Data,
  FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\SalesDB.mdf',
  SIZE = 10MB,
  MAXSIZE = 50MB,
  FILEGROWTH = 5MB )
LOG ON
( NAME = SalesDB_Log,
  FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\SalesDB.ldf',
  SIZE = 5MB,
  MAXSIZE = 25MB,
  FILEGROWTH = 5MB );

3. 创建数据库并指定排序规则

sql

CREATE DATABASE InternationalDB
COLLATE Latin1_General_CI_AS;

完整示例

sql

-- 创建带有多个数据文件和日志文件的数据库
CREATE DATABASE CompanyDB
ON 
PRIMARY 
( NAME = CompanyDB_Primary,
  FILENAME = 'C:\Data\CompanyDB_Prm.mdf',
  SIZE = 10MB,
  MAXSIZE = 50MB,
  FILEGROWTH = 5MB ),
( NAME = CompanyDB_Secondary,
  FILENAME = 'C:\Data\CompanyDB_Sec.ndf',
  SIZE = 5MB,
  MAXSIZE = 25MB,
  FILEGROWTH = 5MB )
LOG ON
( NAME = CompanyDB_Log1,
  FILENAME = 'C:\Data\CompanyDB_Log1.ldf',
  SIZE = 5MB,
  MAXSIZE = 25MB,
  FILEGROWTH = 5MB ),
( NAME = CompanyDB_Log2,
  FILENAME = 'C:\Data\CompanyDB_Log2.ldf',
  SIZE = 5MB,
  MAXSIZE = 25MB,
  FILEGROWTH = 5MB );

验证数据库创建

创建数据库后,可以使用以下语句验证:

sql

-- 查看所有数据库
SELECT name FROM sys.databases;

-- 查看特定数据库的详细信息
EXEC sp_helpdb 'MyDatabase';

注意事项

  1. 确保有足够的权限创建数据库(通常是 CREATE DATABASE 权限)

  2. 确保指定的文件路径存在且SQL Server服务账户有写入权限

  3. 如果不指定文件路径,SQL Server会使用默认实例的数据目录

  4. 创建数据库后,建议立即备份 master 数据库

删除数据库

如果需要删除已创建的数据库,可以使用:

sql

DROP DATABASE MyDatabase;

注意:删除数据库会永久删除所有数据和数据库文件。


SQL Server 判断数据库不存在时创建数据库

在 SQL Server 中,可以使用条件判断来确保只在数据库不存在时才创建数据库。以下是几种实现方法:

方法一:使用 IF NOT EXISTS 条件判断

sql

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'MyDatabase')
BEGIN
    CREATE DATABASE MyDatabase;
    PRINT '数据库 MyDatabase 创建成功';
END
ELSE
BEGIN
    PRINT '数据库 MyDatabase 已存在';
END

方法二:使用更详细的检查

sql

IF DB_ID('MyDatabase') IS NULL
BEGIN
    CREATE DATABASE MyDatabase
    ON 
    ( NAME = MyDatabase_Data,
      FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\MyDatabase.mdf',
      SIZE = 10MB,
      MAXSIZE = 50MB,
      FILEGROWTH = 5MB )
    LOG ON
    ( NAME = MyDatabase_Log,
      FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\MyDatabase.ldf',
      SIZE = 5MB,
      MAXSIZE = 25MB,
      FILEGROWTH = 5MB );
    
    PRINT '数据库 MyDatabase 创建成功';
END
ELSE
BEGIN
    PRINT '数据库 MyDatabase 已存在';
END

方法三:创建带参数的存储过程

sql

CREATE PROCEDURE CreateDatabaseIfNotExists
    @DatabaseName NVARCHAR(128),
    @DataFilePath NVARCHAR(260) = NULL,
    @LogFilePath NVARCHAR(260) = NULL
AS
BEGIN
    SET NOCOUNT ON;
    
    -- 如果未指定文件路径,使用默认路径
    IF @DataFilePath IS NULL
        SET @DataFilePath = CONVERT(NVARCHAR(260), SERVERPROPERTY('InstanceDefaultDataPath')) + @DatabaseName + '.mdf';
    
    IF @LogFilePath IS NULL
        SET @LogFilePath = CONVERT(NVARCHAR(260), SERVERPROPERTY('InstanceDefaultLogPath')) + @DatabaseName + '.ldf';
    
    -- 检查数据库是否已存在
    IF DB_ID(@DatabaseName) IS NULL
    BEGIN
        DECLARE @SQL NVARCHAR(MAX);
        SET @SQL = N'CREATE DATABASE ' + QUOTENAME(@DatabaseName) + 
                   N' ON (NAME = N''' + @DatabaseName + '_Data'', ' +
                   N'FILENAME = N''' + @DataFilePath + ''', ' +
                   N'SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 5MB) ' +
                   N'LOG ON (NAME = N''' + @DatabaseName + '_Log'', ' +
                   N'FILENAME = N''' + @LogFilePath + ''', ' +
                   N'SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB)';
        
        EXEC sp_executesql @SQL;
        PRINT '数据库 ' + @DatabaseName + ' 创建成功';
    END
    ELSE
    BEGIN
        PRINT '数据库 ' + @DatabaseName + ' 已存在';
    END
END
GO

-- 使用存储过程创建数据库
EXEC CreateDatabaseIfNotExists 'MyNewDatabase';

方法四:使用动态SQL实现更灵活的控制

sql

DECLARE @DatabaseName NVARCHAR(128) = 'MyDatabase';
DECLARE @SQL NVARCHAR(MAX);

IF DB_ID(@DatabaseName) IS NULL
BEGIN
    SET @SQL = N'CREATE DATABASE ' + QUOTENAME(@DatabaseName) + 
               N' ON PRIMARY ' +
               N'(NAME = N''' + @DatabaseName + '_Data'', ' +
               N'FILENAME = N''C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\' + @DatabaseName + '.mdf'', ' +
               N'SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 5MB) ' +
               N'LOG ON ' +
               N'(NAME = N''' + @DatabaseName + '_Log'', ' +
               N'FILENAME = N''C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\' + @DatabaseName + '.ldf'', ' +
               N'SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB)';
    
    EXEC sp_executesql @SQL;
    PRINT '数据库 ' + @DatabaseName + ' 创建成功';
END
ELSE
BEGIN
    PRINT '数据库 ' + @DatabaseName + ' 已存在';
END

注意事项

  1. 确保执行脚本的用户有创建数据库的权限

  2. 文件路径需要存在且SQL Server服务账户有写入权限

  3. 使用 QUOTENAME() 函数可以防止SQL注入攻击

  4. 在生产环境中,建议使用存储过程来封装数据库创建逻辑

  5. 考虑添加错误处理机制,使用 TRY...CATCH 块来捕获和处理可能出现的错误

完整示例(带错误处理)

sql

BEGIN TRY
    IF DB_ID('MyDatabase') IS NULL
    BEGIN
        CREATE DATABASE MyDatabase
        ON 
        ( NAME = MyDatabase_Data,
          FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\MyDatabase.mdf',
          SIZE = 10MB,
          MAXSIZE = 50MB,
          FILEGROWTH = 5MB )
        LOG ON
        ( NAME = MyDatabase_Log,
          FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\MyDatabase.ldf',
          SIZE = 5MB,
          MAXSIZE = 25MB,
          FILEGROWTH = 5MB );
        
        PRINT '数据库 MyDatabase 创建成功';
    END
    ELSE
    BEGIN
        PRINT '数据库 MyDatabase 已存在';
    END
END TRY
BEGIN CATCH
    PRINT '创建数据库时出错: ' + ERROR_MESSAGE();
END CATCH

这些方法可以帮助您在 SQL Server 中安全地创建数据库,避免因重复创建而导致的错误。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐