如何在不丢失现有信息的情况下提出修改数据库中现有表的脚本?

时间:2012-12-03 08:08:05

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

我有一个数据库的应用程序,它们运行良好,一切都很好。

现在,我只需要通过添加更多列来修改数据库中的一个表。我正在使用SQL Server,数据库管理员让我向他提供修改该表的脚本。

那怎么做?

我正在使用SQL Server Management Studio,当我点击表格右键单击时,我习惯选择要创建的脚本,Management Studio将为我提供脚本。现在,这个表有信息,所以我想我不应该为这个表使用create script。

新列应该允许空值。

那我该怎么用?

有关您的信息,请参阅以下脚本:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Test](
    [ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [No] [char](20) NOT NULL,
    [Date] [smalldatetime] NULL,
    [ProjectType] [char](500) NULL,
    [ProjectPhase] [char](300) NULL,
    [rejected_reason] [varchar](max) NULL,
    [archived_reason] [varchar](max) NULL,
    [forward_to] [varchar](max) NULL,
    [forward_type] [varchar](max) NULL,
    [forward_concern] [varchar](max) NULL,
 CONSTRAINT [PK_Test] 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]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Test] ADD  CONSTRAINT [DF_LLATestB_No]  DEFAULT ('*') FOR [No]
GO

ALTER TABLE [dbo].[Test] ADD  CONSTRAINT [DF_LLATestB_Status]  DEFAULT ((2)) FOR [Status]
GO

ALTER TABLE [dbo].[Test] ADD  CONSTRAINT [DF_LLATestB_AID]  DEFAULT ((0)) FOR [AID]
GO

ALTER TABLE [dbo].[Test] ADD  CONSTRAINT [DF_LLATestB_Hit]  DEFAULT ((0)) FOR [Hit]
GO

ALTER TABLE [dbo].[Test] ADD  CONSTRAINT [DF_LLATestB_Sent]  DEFAULT ((0)) FOR [Sent]
GO

ALTER TABLE [dbo].[Test] ADD  CONSTRAINT [DF_LLATestB_SentTo]  DEFAULT ((0)) FOR [SentTo]
GO

ALTER TABLE [dbo].[Test] ADD  CONSTRAINT [DF_LLa_Added_To_Cart]  DEFAULT ((0)) FOR [Added_To_Cart]
GO

应添加到此表的新列的示例如下:

[rejected_reason] [varchar](max) NULL,
[archived_reason] [varchar](max) NULL,
[forward_to] [varchar](max) NULL,
[forward_type] [varchar](max) NULL,

1 个答案:

答案 0 :(得分:0)

当你研究SQL Server Books Online on MSDN时,它应该是小菜一碟 - 使用ALTER TABLE

 ALTER TABLE dbo.LLa
 ADD [rejected_reason] [varchar](max) NULL

 ALTER TABLE dbo.LLa
 ADD [archived_reason] [varchar](max) NULL

 ALTER TABLE dbo.LLa
 ADD [forward_to] [varchar](max) NULL

 ALTER TABLE dbo.LLa
 ADD [forward_type] [varchar](max) NULL

问题是:你真的你的每一列需要多达2 GB的数据(VARCHAR(MAX))吗?好像有点矫枉过正!

您应始终使用适当的数据类型 - 如果该列最多只能容纳100个字符 - 为什么不使用VARCHAR(100)而不是使用max数据类型?