如果数据库不存在则创建数据库

mic*_*cer 14 sql sql-server

SQL Server如果不存在,我想制作用于创建数据库的脚本。

IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'DataBase')
  BEGIN
    CREATE DATABASE DataBase

    USE DataBase

    CREATE TABLE TableName (
        Id INT PRIMARY KEY IDENTITY (1, 1),
        Name VARCHAR(100)
    )

    --more tables here
    --some procedures here too

  END
Run Code Online (Sandbox Code Playgroud)

从上面的代码我得到这个错误:

消息 911,级别 16,状态 1,第 5 行数据库“DataBase”不存在。确保正确输入名称。

当数据库不存在时,如何使用表和过程创建数据库?我想在一个查询中完成

New*_*Man 12

您能否检查以下脚本:

    IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'DataBase')
  BEGIN
    CREATE DATABASE [DataBase]


    END
    GO
       USE [DataBase]
    GO
--You need to check if the table exists
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='TableName' and xtype='U')
BEGIN
    CREATE TABLE TableName (
        Id INT PRIMARY KEY IDENTITY (1, 1),
        Name VARCHAR(100)
    )
END
Run Code Online (Sandbox Code Playgroud)


Tha*_*ilo 11

显然你必须从(并注意GO这里)开始:

USE master
GO
Run Code Online (Sandbox Code Playgroud)

但是你必须这样做:

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'MyTestDataBase')
BEGIN
  CREATE DATABASE MyTestDataBase;
END;
GO
Run Code Online (Sandbox Code Playgroud)

GO再介意。如果您不使用GOSSMS(或任何其他客户端),仍然会认为您的批处理未完成,您的数据库仍未创建,因此无法进一步使用,并且您会收到您发布的错误消息。

现在您可以开始使用您刚刚创建的数据库:

USE MyTestDataBase;
GO
Run Code Online (Sandbox Code Playgroud)

再次,注意GO声明。在这种情况下,这是不可接受的,因为不可能在一批中组合CREATE DATABASECREATE TABLE陈述。所以在GO继续之后:

IF OBJECT_ID('MyTestTable', 'U') IS NULL
BEGIN
  CREATE TABLE dbo.MyTestTable
  (
    Id   INT PRIMARY KEY IDENTITY(1, 1)
  , Name VARCHAR(100)
  );
END;
Run Code Online (Sandbox Code Playgroud)

正如其他人已经提到的,最好检查每个表是否存在,如果不存在则执行创建操作,如果存在则更改操作(或什么都不做)。但是,如果您真的不想检查每个表是否存在,例如当您确定需要从头开始时,您可以从删除数据库(如果存在)开始:

IF EXISTS (SELECT * FROM sys.databases WHERE name = 'MyTestDataBase')
BEGIN
    DROP DATABASE MyTestDataBase;  
END;
CREATE DATABASE MyTestDataBase;
GO
Run Code Online (Sandbox Code Playgroud)