Sql server SQL Server 2008 R2将列添加到特定位置

Sql server SQL Server 2008 R2将列添加到特定位置,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,我使用的是SQL Server 2008 R2,我希望在表中列顺序的特定位置添加一个新列,而不是在末尾。我希望避免重新创建表格。如何在不重新创建表的情况下执行此操作 i、 e 添加新列 Table: Bob ========== Col1 NewCol Col2 你不能。列始终添加在列列表的末尾。更改顺序的唯一方法是从头开始重新创建表 也就是说,列的实际物理顺序和列定义的逻辑顺序对您来说都不重要。如果您对列顺序有依赖关系,则代码将被破坏。如果您期望从列顺序中获得性能提升,那么

我使用的是SQL Server 2008 R2,我希望在表中列顺序的特定位置添加一个新列,而不是在末尾。我希望避免重新创建表格。如何在不重新创建表的情况下执行此操作

i、 e

添加新列

Table: Bob
==========
   Col1
   NewCol
   Col2

你不能。列始终添加在列列表的末尾。更改顺序的唯一方法是从头开始重新创建表


也就是说,列的实际物理顺序和列定义的逻辑顺序对您来说都不重要。如果您对列顺序有依赖关系,则代码将被破坏。如果您期望从列顺序中获得性能提升,那么这些都是虚构的。

不要这样做。同时建议不要使用SELECT*,在这种情况下,既然您列出了所有列,为什么它会影响它们的内部顺序

也就是说,如果你一定要,这里有一个演示,它不会让你失望。但是,由于不能插入中间,所以必须删除列。

create table BOB(col1 int, colspace int, col2 int, col3 varchar(10))
insert BOB values (1,3, 2,'test')
;
alter table BOB add col2_copy int, col3_copy varchar(10), NewCol datetime
;
update BOB set col2_copy = col2, col3_copy = col3
;
alter table BOB drop column col2
alter table BOB drop column col3
;
alter table BOB add col2 int, col3 varchar(10)
;
update BOB set col2 = col2_copy, col3 = col3_copy
;
alter table BOB drop column col2_copy
alter table BOB drop column col3_copy
;

select * from BOB

一旦涉及到约束和默认设置,它就会变得非常困难。

我看不出有什么办法来编写您要做的事情的脚本。但是,在SSMS中(至少在V10.5中),您可以在对象资源管理器中的表上单击鼠标右键,然后选择“设计”。这允许您在列顺序中的任何位置插入列。它还保留表上的内容,如FK引用等


我还没有研究验证SQL Server在幕后到底在做什么,我自己也没有使用它,但它确实存在。

你可以通过右键单击表格,然后转到“设计”并通过拖放来更改顺序。

你为什么要重新创建表格,为什么列顺序对您很重要?可能重复:,感谢链接,但是它们都提到重新创建表。分区/分区切换要求表之间的定义完全相同,包括列顺序。同意。但是,通常最好(尤其是有一个大表)将主键这样的公共字段作为第一列。除了人类可读性之外,列顺序并不重要,但是-如果您坚持,您可以做的一件事是创建一个新表,从旧表大容量导出,大容量插入新表,然后执行drop/sp_重命名。您需要确保在此期间防止对原始表进行任何更改,或者在同一事务中的删除/重命名之前运行同步插入/更新脚本。是的,这样做的唯一原因是人的可读性,并且只有在有简单方法的情况下才这样做。如果不重新创建表,似乎没有什么简单的方法。谢谢大家回答这个问题。很抱歉给大家带来麻烦,但是在您运行完所有这些之后,请从sys.system\u internals\u partition\u columns ic中选择*并在ic.partition\u id=p.partition\u id where object\u id=object\u id('BOB')中连接sys.partitions p on ic.partition\u id,其中object\u id=object\u id('BOB'),并仔细查看结果。如果您仍然有疑问,请查看第8列的叶偏移量<代码>删除列不删除任何内容,只是将列标记为“未使用”。特别固定的列,它们仍然会占据所有的空间。现在,如果你加入一个ALTER表。。。在结束时重新生成如果是,将删除列。但您仍然重新创建了表(尽管是在内部,并保留了所有约束和权限)。大部分差异是学术性的,但当数据的大小令人望而却步时,表以某种方式重建的事实确实产生了所有的差异(即无法完成)。@remus答案无论如何都是学术性的,因为前几个字不允许这样做。它用于显示如何(可视化地)移动任何前端可能需要的列(内部)
可能是仅使用select*
的DAL。请随意添加问题的详细答案。根据新列定义的具体定义,这可能仍然会重新创建表。
create table BOB(col1 int, colspace int, col2 int, col3 varchar(10))
insert BOB values (1,3, 2,'test')
;
alter table BOB add col2_copy int, col3_copy varchar(10), NewCol datetime
;
update BOB set col2_copy = col2, col3_copy = col3
;
alter table BOB drop column col2
alter table BOB drop column col3
;
alter table BOB add col2 int, col3 varchar(10)
;
update BOB set col2 = col2_copy, col3 = col3_copy
;
alter table BOB drop column col2_copy
alter table BOB drop column col3_copy
;

select * from BOB