2013-11-23 63 views
1

今天我注意到了一個奇怪的行爲SQL Server 2008 R2的「Script Table As..」和「Generate Script」功能。創建表腳本在alter語句中添加列

我在數據庫中有一個表。並且使用ALTER查詢,我在該現有表上插入了一個新列。

現在,我想CREATE TABLE腳本爲同一張表。所以我右鍵單擊該表並從上下文菜單中選擇「Script Table As -> CREATE TO -> New Query Window」選項。

我很驚訝在CREATE表查詢在新的查詢窗口中找到ALTER表腳本。

結果我在新的查詢窗口得到的是如下:

/****** 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 query,而不是直接向表中添加列?

感謝

回答

2

我看到不同的是在SET ANSI_PADDING值。第一組列在創建時使用SET ANSI_PADDING ON,而在第二組中則爲OFF,請注意,SET是它們之間唯一的事情。因此,在一個聲明中不能以任何方式編寫腳本,它必須分成兩部分。

這也是一個推薦的做法總是離開SET ANSI_PADDING ON的一切,而且往往是設計師喜歡改變這一點,其他設置隨意,留下腳本未定義的狀態。可能地,表和它的列是由設計者在不同階段以不同設置創建的,因此設置不同。

此外,還有一個ALTER TABLE增加了一個約束。沒有理由這樣做,總是可以將它與其影響的列一起添加,但設計人員之後會以最低效的方式做到這一點。

一般來說,我寧願不要使用設計師,因爲它太麻煩,不可靠。學習和編寫自己的腳本並使用它們會更好。