SQL生成脚本不创建数据库

时间:2013-06-27 09:03:32

标签: sql sql-server

我创建了一个数据库脚本。

但是当我运行它时,脚本不会创建数据库。它跳过“Create db”语句,只创建表(在我现在选择的数据库上,所以不太理想....)

(顺便执行查询时没有错误。)

为什么会这样?为什么你不能一次创建数据库并编辑其中的内容?

(我知道你可以先检查数据库是否存在,但这不应该从一开始就发生)

- 我的剧本 -

CREATE DATABASE [EthicsDB] 

USE [EthicsDB]
go

CREATE TABLE [dbo].[TempEmployee](
    [PersonnelNumber] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](80) NULL,
    [SurName] [varchar](80) NULL,
    [ManagerEmail] [varchar](80) NULL,
    [ManagerName] [varchar](80) NULL,
 CONSTRAINT [PK_TempEmployee] PRIMARY KEY CLUSTERED 
(
    [PersonnelNumber] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

4 个答案:

答案 0 :(得分:5)

您必须在CREATE DATABASE [EthicsDB]之后使用GO。

答案 1 :(得分:2)

试试这个 -

USE [master]
GO

IF  EXISTS (
    SELECT 1 FROM sys.databases WHERE name = N'EthicsDB'
)
DROP DATABASE [EthicsDB]
GO

CREATE DATABASE [EthicsDB]
GO --<----

USE [EthicsDB]
GO

CREATE TABLE [dbo].[TempEmployee](
    [PersonnelNumber] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](80) NULL,
    [SurName] [varchar](80) NULL,
    [ManagerEmail] [varchar](80) NULL,
    [ManagerName] [varchar](80) NULL,
 CONSTRAINT [PK_TempEmployee] PRIMARY KEY CLUSTERED 
(
    [PersonnelNumber] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

答案 2 :(得分:2)

如果您按照提供的方式运行SQL,则会在行

上收到错误消息
USE [EthicsDB]

当SQL Server通过SQL CMD运行SQL命令时,它会批量处理SQL。

由于在创建数据库语句之后没有GO语句,因此可能SQL Server尚未识别出已创建新数据库Ethics,因此当您尝试通过USE [EthicsDB]使用数据库时,该语句将失败。 / p>

由于您的SQL语句未包含在事务中,并且您没有检查错误,因此如果SQL Server遇到错误,它将引发错误,但也会继续处理查询的其余部分。

在提供的查询中,这会导致在当前数据库中创建新表。

要解决此问题,请将查询修改为

CREATE DATABASE [EthicsDB] 
go
USE [EthicsDB]
go

答案 3 :(得分:0)

您应该将每个操作包装在事务块中。

另外,在创建表格时,我通常会检查它是否已经存在。

如果你只运行 创建数据库,会发生什么?