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

Gor*_*yII 13 t-sql sql-server sql-server-2008

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

Table: Bob
==========
   Col1
   Col2
Run Code Online (Sandbox Code Playgroud)

添加新列.

Table: Bob
==========
   Col1
   NewCol
   Col2
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 19

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

话虽如此,对于你来说,列的实际物理顺序和列定义的逻辑顺序永远不应该是重要的.如果您对列顺序有依赖性,那么您的代码就会被破坏.如果您希望从列顺序中获得性能提升,则这些都是神话.

  • 是的,这样做的唯一原因是人类的可读性,只有这样才能有一个简单的方法.似乎没有重新创建表格是不容易的.谢谢大家回答这个问题. (3认同)
  • 同意.但是,通常很好(特别是大表)可以使用像主键这样的公共字段作为第一列.除了人类可读性之外,对列顺序有零重要性,但是 - 如果你坚持,你可以做的一件事就是创建一个新表,从旧表批量导出,批量插入新表,然后做一个滴/ sp_rename.您需要确保在此期间阻止对原始表发生任何更改,或者在同一事务中删除/重命名之前运行同步插入/更新脚本. (2认同)

Ric*_*iwi 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
Run Code Online (Sandbox Code Playgroud)

一旦遇到约束和默认值,它就会变得非常困难.

  • 现在,如果你在最后加入一个 ALTER TABLE... REBUILD 那么是的,列被删除。但是您仍然重新创建了表(尽管是在内部,并保留了所有约束和权限)。大多数差异是学术上的,但是当数据的大小令人望而却步时,表以某种方式重建的事实确实会产生很大的不同(即无法完成)。 (2认同)