作为CREATE的脚本表包括最近的列添加为ALTER?

时间:2010-09-16 13:44:48

标签: sql-server-2005 ssms sql-server-2008

我正在针对SQL Server 2005后端运行SQL Server Management Studio 2008。 SSMS刚刚展示了我从未见过的行为。我不知道这是SSMS 2008中的新功能还是其他功能。

基本上,发生了什么,我在现有表中添加了一些新列。添加这些列后,我在表格的IDE中执行了“Script table as ... CREATE”。我希望只获得一个包含所有行的CREATE TABLE语句,prvious和new。但是,生成的代码是表的原始定义的CREATE语句,以及每个新列的单独ALTER TABLE T ADD [Column]...语句。

这不是问题(实际上从最近的变更管理角度来看可能很有用...... sorta),但这是我以前从未见过的行为。

我认为这可能与行长度有关,但是在表页分割之前,长度在8,000字节限制之内(原谅我的术语......我是开发人员而不是DBA)。当然,它不是一个小表(现在有127列增加了一点,行长度超过7,000字节)。

我看到了什么?这是SSMS或SQL Server本身的功能/功能吗?这是大表定义的副作用吗?

以下示例不重复该行为,但它说明(简化)我所看到的内容:

CREATE TABLE dbo.Table_1
(
ID int NOT NULL,
title nvarchar(50) NOT NULL
)

然后,

ALTER TABLE dbo.Table_1 ADD 
[description] [varchar](50) NULL,
[numthing] [nchar](10) NULL

我希望这会产生:

CREATE TABLE [dbo].[Table_1](
[ID] [int] NOT NULL,
[title] [nvarchar](50) NOT NULL,
[description] [varchar](50) NULL,
[numthing] [nchar](10) NULL,

然而,这是产生的:

CREATE TABLE [dbo].[Table_1](
[ID] [int] NOT NULL,
[title] [nvarchar](50) NOT NULL)
ALTER TABLE [dbo].[Table_1] ADD [description] [varchar](50) NULL
ALTER TABLE [dbo].[Table_1] ADD [numthing] [nchar](10) NULL

2 个答案:

答案 0 :(得分:1)

我相信您会看到Microsoft重新使用SQL生成代码的两个部分。

我猜你单击生成CREATE脚本时没有保存更改;所以生成代码没有最新版本的表来生成它。相反,它在旧表上运行正常生成代码,然后在“脚本更改”选项后面运行代码以使其更新。

巧妙的代码重用具有特殊的结果。

答案 1 :(得分:1)

我怀疑您在帖子中“清理”了SQL,因为它通常包含许多其他SET和GO语句。我假设你删除了“SET ANSI_PADDING”语句。

表中的某些列可能将ANSI_PADDING设置为ON,而其他列则为OFF。 ANSI_PADDING选项会影响设置后创建的所有列。由于将按表顺序创建列,因此需要根据表使用ANSI_PADDING选项几次。真正的问题是MS SQL Server无法在CREATE TABLE语句中设置ANSI_PADDING选项。所以它需要在初始CREATE之后通过在适当的SET ANSI_PADDING语句之后使用ALTER TABLE语句来完成一些工作。

请参阅:http://kevine323.blogspot.com/2011/03/ansipadding-and-scripting-tables-from.html