Sql-Server-2008-R2

SSDT 表列順序

  • June 17, 2016

我意識到 SQLPACKAGE.EXE 的行為會根據對錶模式所做的更改而改變:

  1. 在表格末尾添加新列:“表格已更改”
  2. 從表中刪除列:“表已更改”
  3. 在現有列之間添加一列或只是更改它們的順序:“表的重新創建已開始”

(我自己做了翻譯,它們可能不准確但相似)。

第 3 步在發布過程中需要很長時間。我想知道為什麼以及到底發生了什麼。我懷疑表結構是完全重新創建的。我不想要這個,我基本上不會非常關心不同目標系統中的列順序。有什麼辦法可以防止這個耗時的過程嗎?

編輯:

同時我發現很多人都在為同樣的問題而苦苦掙扎。SSDT 沒有任何選項來忽略目標表的列順序。這使得它重新排列如上所述的所有數據。這既費時又完全沒用,但如果您想使用 SSDT,則別無選擇。

請在此處查看並投票:

Visual Studio 使用者語音項

Microsoft Connect 項目

MSDN論壇討論

你是對的,“重新排列”列順序的唯一方法是創建一個具有新結構的表並將舊數據推入其中,刪除舊表,然後重命名新表(或該表的某些變體) . 它需要復製表中的所有數據以及一些刪除和重命名。

有什麼辦法可以防止這個耗時的過程嗎?

肯定有!**停止關心列順序。**如果這很重要,請願意付出代價,或者在設計上花費更多時間,這樣您就不會在獲得“正確”的列順序之前多次重新部署同一個表。

如果您使用表設計器並更改列的順序,SSMS 會做完全相同的事情——它將創建一個新表、複製所有數據、刪除舊表並重命名新表。這並不便宜 - 純粹的物理數據移動需要時間,並且必須完全記錄該移動。

您還會注意到,沒有允許您指定新列的物理位置的 T-SQL / DDL 命令;這是因為 SQL Server 在不重建的情況下不支持它。

無論如何,這並不重要。您的應用程序可以被編碼為以它想要的任何順序請求列,而不管底層物理實現如何。如果這是為懶惰的SELECT *抽查員準備的,請為他們創建一個視圖。

引用自:https://dba.stackexchange.com/questions/128047