创建表脚本使用alter语句添加列

时间:2013-11-23 13:32:58

标签: sql-server sql-server-2008 sql-server-2008-r2

我注意到今天SQL Server 2008 R2的“Script Table As..”和“Generate Script”功能出现了奇怪的行为。

我在数据库中有一个表。使用ALTER查询,我在现有表上插入了一个新列。

现在,我想要同一个表的CREATE TABLE脚本。所以我右键单击了该表,并从上下文菜单中选择了“Script Table As -> CREATE TO -> New Query Window”选项。

我很惊讶在新查询窗口中ALTER表查询后找到CREATE表脚本。

我在新查询窗口中得到的结果如下:

/****** Object:  Table [dbo].[TblMember]    Script Date: 11/23/2013 18:47:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TblMember](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [First_Name] [varchar](50) NULL,
    [Middle_Name] [varchar](50) NULL,
    [Last_Name] [varchar](50) NULL,
    [Gender] [varchar](10) NULL,
) ON [PRIMARY]
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[TblMember] ADD [Religion] [varchar](50) NULL
ALTER TABLE [dbo].[TblMember] ADD [RaceId] [int] NULL
/****** Object:  Index [PK_TblMember]    Script Date: 11/23/2013 18:47:26 ******/
ALTER TABLE [dbo].[TblMember] ADD  CONSTRAINT [PK_TblMember] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

我也试过“Generate Script”,但结果相同。

有人能告诉我它为什么要添加一个alter查询,而不是直接在表中添加列吗?

由于

1 个答案:

答案 0 :(得分:2)

我看到的差异在于SET ANSI_PADDING的值。使用SET ANSI_PADDING ON创建的第一组列,而在第二组中为OFF,请注意SET是它们之间的唯一内容。因此,不能在单个语句中以任何方式编写脚本,它必须分成两部分。

这也是一种推荐做法,始终为所有内容留下SET ANSI_PADDING ON,并且设计师通常喜欢随意更改此设置和其他设置,使脚本处于未定义状态。可能,表格及其列是由设计师在不同阶段创建的不同设置,因此设置不同。

此外,还有一个ALTER TABLE添加约束。没有任何理由,它总是可以将它与它所影响的列一起添加,但设计师之后只是以最低效的方式执行此操作。

一般来说,我更喜欢永远不会使用设计师,因为它太过马车和不可靠。学习和编写自己的脚本并使用它们会更好。