2009-04-20 67 views
28

是否可以將列添加到SQL Server中特定序號位置的表中?將新表列添加到特定序號位置

例如,我們的表總是在每個表定義的「結尾」都有CreatedOn,CreatedBy,LastModifiedOn,LastModifiedBy列?我希望新列在SSMS上方顯示。

如果我正在編寫所有數據庫更改的腳本,是否有辦法在表的末尾保留此順序?如果這樣做甚至應該完成的話,我並不試圖進行一場火焰戰爭。如果您想了解迅速退化成一個線程,這裏是一個很好的一個:

http://www.developersdex.com/sql/message.asp?p=581&r=5014513

+0

或者這就是爲什麼我應該在每張桌子上創建視圖的原因? – 2009-04-20 19:54:44

+0

相關:http://stackoverflow.com/q/1605144/12484 – 2017-02-08 15:44:00

回答

23

你必須創建,反映了原始表的模式,但與所需的列順序創建臨時表,然後將原件的內容複製到溫度。刪除原件並重命名臨時文件。

這是SQL Management Studio在後臺執行的操作。

使用模式同步工具,您可以自動生成這些腳本。

+0

臨時表不能在`tempdb`之外重命名。 – 2017-06-25 09:37:09

3

進入SQL Server管理工作室,並「設計」一個現有的表。在中間插入一列,看看它創建的腳本。它基本上會創建一個具有正確列順序的臨時表,從原始表中插入數據,刪除原始表並重命名臨時表。這可能是你需要做的。

3

據我所知,沒有已知的方法來改變列的順序。在幕後SQL管理工作室做何塞巴西里說。如果你有一張大桌子,那麼像這樣改變列順序是不切實際的。

您可以使用「查看」。使用SQL視圖,您可以使用任何您喜歡的順序而不受表格列更改的影響。

0

您不能在表結構中的特定序號位置創建列 - 此外,您爲什麼要? SQL Server中列的順序完全不相關。

SQL Server Management Studio有一個設計視圖,它似乎允許您在列列表中的任何位置創建一個列 - 但在後臺真正發生的是帶有新列的新表被創建,舊的一個被丟棄。

沒有SQL DDL命令可以在特定位置創建列或「重新排序」列。這真的不需要。

馬克

7

答案是肯定的,這在技術上是可行的,但你將有一個頭痛這樣做,這將需要很長的時間來執行,併成立。

一:創建/複製/刪除/重命名

這實際上是什麼樣的SQL Server是在做圖形界面:這裏是它的產生,當你點擊「保存」執行腳本的例子在將新列添加到表的開頭之後按鈕。

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 
BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_SomeTable 
    (
    MyNewColumn int NOT NULL, 
    OriginalIntColumn int NULL, 
    OriginalVarcharColumn varchar(100) NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON 
GO 
IF EXISTS(SELECT * FROM dbo.SomeTable) 
    EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF 
GO 
DROP TABLE dbo.SomeTable 
GO 
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO 

GO 
COMMIT 

二:ADD COLUMN/UPDATE/DROP COLUMN /重命名

這個方法基本上涉及創建要添加到您的新列的 '正確' 的任何現有列的副本,將數據傳輸到新列,然後刪除原件並重新命名。這會對任何索引或限制造成嚴重破壞,因爲您必須重新指定它們。這在技術上是可行的,但是在開發和執行方面又耗費時間。

CREATE TABLE MyTest (a int, b int, d int, e int) 

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5) 

SELECT * FROM MyTest -- your current table 

ALTER TABLE MyTest ADD c int -- add a new column 
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move 
ALTER TABLE MyTest ADD e_new int 

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns 

ALTER TABLE MyTest DROP COLUMN d -- remove the originals 
ALTER TABLE MyTest DROP COLUMN e 

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns 
EXEC SP_RENAME 'MyTest.e_new', 'e'; 

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample 

三:與它生活

這強烈地冒犯了我的秩序感......但有時,它只是不值得重新洗牌。

0

TFS 2013會自動爲您做這個

無論如何向表中添加新列,然後將更改提交到TFS。從那裏你可以在Visual Studio中打開表格的sql文件,並手動移動T-SQL CREATE腳本中列的順序。然後,您可以使用工具> SQL Server>新建模式比較下的VS模式比較工具來更新目標數據庫。選擇您的數據庫項目,將您的更改作爲源,並將要更新的數據庫作爲目標。比較,選擇表格的腳本,然後選擇更新。 VS會自動刪除和添加。你所有的數據都是安全的,並且也是索引。

0

髒又簡單。
將表導出到csv。
在所需位置插入新數據。
放下桌子。
創建具有所需色譜柱規格的新表格。
將csv的列加載到新表中。

相關問題