2011-02-15 64 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

您可以通過右鍵單擊表格並進行設計並通過拖放來更改順序。

相關問題