2011-02-15 66 views
13

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

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

添加新列。

Table: Bob 
========== 
    Col1 
    NewCol 
    Col2 
+2

为什么你需要重新创建表格,为什么列顺序对你很重要? – 2011-02-15 02:50:28

+0

可能的重复:[添加一个新的表列到特定的序号位置](http://stackoverflow.com/questions/769828/add-a-new-table-column-to-specific-ordinal-position),[添加列在特定的地方SQL Server上?](http://stackoverflow.com/questions/3968954/add-column-on-sql-server-on-specific-place) – 2011-02-15 02:57:19

+0

感谢您的链接,但他们都提到重新创建表。 – GordyII 2011-02-15 03:12:44

回答

19

你不行。列总是添加在列列表的末尾。更改顺序的唯一方法是从头开始重新创建表。这就是说,它永远不应该影响到什么是列的实际物理顺序,也不是列定义的逻辑顺序。如果你对列顺序有依赖性,你的代码就会被破坏。如果你期望从列顺序中获得性能上的提升,那就是神话。

9

不要这样做。这与建议永远不要使用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 

一旦你有约束和默认参与,它变得更加困难。

1

我没有看到脚本您正在尝试做什么。但是,在SSMS中(至少在10.5版本中),您可以右键单击对象资源管理器中的表格,然后选择“设计”。这允许您在列顺序的任何位置插入一列。它还保留了你的桌面上的东西,如FK参考等。

我还没有研究过验证SQL Server实际上是在幕后做什么,我不使用它来展示自己,但它在那里。

-2

您可以通过右键单击表格并进行设计并通过拖放来更改顺序。