2008-08-04 46 views
73

如果我將列添加到Microsoft SQL Server中的表中,我可以控制列在邏輯上顯示在查詢中的位置嗎?我可以在邏輯上重新排列表中的列嗎?

我不想混淆磁盤上的列的物理佈局,但我想在邏輯上將列組合在一起,以便像SQL Server Management Studio這樣的工具以便捷的方式列出表格的內容。

我知道我可以通過SQL管理工作室進入他們的「設計」模式並拖動列的順序,但我希望能夠在原始SQL中執行此操作,以便我可以從命令行執行腳本。

+0

但是看看這個鏈接:

如果你有一個手動過程,過多的情況下,你應該試試這個腳本。 http://blog.sqlauthority.com/2013/03/11/sql-server-how-to-add-column-at-specific-location-in-table/ – sqluser 2015-01-15 23:43:33

+0

另請參閱http://stackoverflow.com/questions/4402312/why-cant-i-reorder-my-sql-server-columns和http://stackoverflow.com/questions/5327545/adding-column-between-two-other-columns-in-sql-server – 2015-08-06 18:12:14

+0

更多相關的東西:http://stackoverflow.com/questions/34818/sql-server-does-column-order-matter和http://dba.stackexchange.com/questions/18719/does-the-order-of-columns在表中的定義事項 – 2015-08-06 18:15:06

回答

61

您不能在不創建新表的情況下以編程方式(以安全的方式)執行此操作。

當您提交重新排序時,企業管理器執行的操作是創建新表,移動數據,然後刪除舊錶並將新表重命名爲現有名稱。

如果您希望您的列按特定順序/分組而不改變它們的物理順序,則可以創建一個視圖,它可以是任何您想要的視圖。

1

當Management Studio執行此操作時,它將創建一個臨時表,將所有內容全部複製,刪除原始表並重命名臨時表。沒有簡單的等價的T-SQL語句。

如果你不喜歡這樣做,你總是可以按照你喜歡的順序創建一個表格的視圖並使用它?

編輯:毆打!

5

如果我理解你的問題,你想影響哪些列返回第一,第二,第三等在現有的查詢,對不對?

如果所有的查詢都是用SELECT * FROM TABLE編寫的 - 那麼當它們放在SQL中時,它們將顯示在輸出中。如果您的查詢是使用SELECT Field1,Field2 FROM TABLE編寫的 - 那麼它們在SQL中放置的順序並不重要。

1

可以通過直接修改系統表使用SQL來完成。例如,請看這裏:

Alter table - Add new column in between

不過,我不會建議使用系統表打,除非它是絕對必要的。

35

我想這裏的每個人都缺少的是,雖然不是每個人都必須面對安裝在全國和全世界的同一軟件系統的10,20或1000個實例......那些設計商業銷售的軟件這樣做。因此,我們隨着時間的推移擴展系統,通過在需要新功能時添加字段來擴展表,並且由於這些字段被確定屬於現有的表,並且因此在十年內擴展,增長,添加字段等到表格......然後必須使用設計中的這些表格來支持,有時可以深入挖掘原始數據/故障排除以調試新的功能錯誤......它令人難以置信地變得越來越難以獲得您想要的主要信息在第一批領域內可以看到,當你可能有30-40-50甚至90場的桌子,並且是在嚴格規範化的數據庫中。

我經常希望我可以這樣做,因爲這個確切原因。但是缺少SQL的功能,按照我想要的方式爲新表創建一個創建腳本,將Insert寫入它,然後從現有表中刪除所有現有的約束,關係,鍵,索引等等等,並重命名「新」表返回到舊名稱,然後閱讀所有這些鍵,關係,索引等等等等......

不僅繁瑣,耗時,而且...在五年內,將需要再次發生....

它是如此接近值得大量的工作,但重點是......它不會是我們最後一次需要這種能力,因爲我們的系統將繼續增長,擴大,並在需求/設計增加的驅動下獲得領域。

大多數開發人員認爲,從單一系統角度來看,它只服務於單個公司或非常具體的硬盤盒市場。

「關閉的,現成的」,但顯著進步的設計師和發展的領導者在其市場空間將總是要處理這個問題,一遍又一遍.....會愛一個創造性的解決方案,如果任何人有一。這很容易救我公司一個星期了十幾個小時,就不必滾動過來,或者記得在那裏「說,」現場是在源數據表....

1

有一種方式,但它只是暫時的查詢本身。例如,

可以說你有5個表格。 表叫T_Testing

名字,姓氏,******中國,Email和Member_ID

你想讓它列出他們的ID,然後姓,然後名字,然後電話然後電子郵件。

您可以按照選擇。

Select Member_ID, LastName, FirstName, PhoneNumber, Email 
From T_Testing 

除此之外,如果你只是想姓氏出於某種原因第一個名稱前顯示,你可以做到這一點也如下:你想

Select LastName, * 
From T_Testing 

的唯一的事情是確保你做的是,排序依據或Where功能需要,如果你打算使用一個Where或排序依據

例被表示爲TABLE.COLUMN:

Select LastName, * 
From T_Testing 
Order By T_Testing.LastName Desc 

我希望這可以幫助,我找到了它,因爲我需要自己做這個。

1
  1. 腳本您現有的表的查詢窗口。
  2. 運行此腳本針對測試數據庫(刪除使用語句)
  3. 使用SSMS使列變化,你需要
  4. 單擊生成更改腳本(在 按鈕欄最左邊和最底層的圖標,默認情況下)
  5. 使用這個腳本對你的真正的表

所有腳本確實是創建具有所需列單第二表的表,會將所有的數據進去,丟棄原始表,然後重命名二次表取而代之。如果你想要一個部署腳本,這可以節省你自己編寫它。