我注意到今天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查询,而不是直接在表中添加列吗?
由于
答案 0 :(得分:2)
我看到的差异在于SET ANSI_PADDING
的值。使用SET ANSI_PADDING ON
创建的第一组列,而在第二组中为OFF
,请注意SET是它们之间的唯一内容。因此,不能在单个语句中以任何方式编写脚本,它必须分成两部分。
这也是一种推荐做法,始终为所有内容留下SET ANSI_PADDING ON
,并且设计师通常喜欢随意更改此设置和其他设置,使脚本处于未定义状态。可能,表格及其列是由设计师在不同阶段创建的不同设置,因此设置不同。
此外,还有一个ALTER TABLE
添加约束。没有任何理由,它总是可以将它与它所影响的列一起添加,但设计师之后只是以最低效的方式执行此操作。
一般来说,我更喜欢永远不会使用设计师,因为它太过马车和不可靠。学习和编写自己的脚本并使用它们会更好。