将新表列添加到Microsoft SQL Server中的特定序号位置

Eve*_*ien 41 sql-server change-management database-table

是否可以在Microsoft SQL Server中的特定序号位置向表中添加列?

例如,我们的表在每个表定义的"结尾"总是有CreatedOn,CreatedBy,LastModifiedOn,LastModifiedBy列?我希望新列在SSMS上方显示在这些列之上.

如果我编写了所有数据库更改的脚本,是否有办法在表的末尾保留此顺序?

仅供参考,如果这样做,我不会试图发动火焰战争.如果你想阅读一个快速退化的线程,这里有一个好的:

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

Jos*_*lio 30

您必须创建一个临时表,该表反映原始表的模式,但具有所需的列顺序,然后将原始内容复制到temp.删除原始文件并重命名temp.

这就是SQL Management Studio在幕后所做的事情.

使用模式同步工具,您可以自动生成这些脚本.


KM.*_*KM. 14

进入SQL Server管理工作室,并"设计"现有的表.在中间插入一列,右键单击空白区域,然后选择生成更改脚本...

现在看看它创建的脚本.它基本上会创建一个具有正确列顺序的临时表,插入原始表中的数据,删除原始表,并重命名临时表.这可能是你需要做的.

在此输入图像描述

您可能还需要取消选中此选项以允许创建更改脚本

在此输入图像描述


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

二:添加列/更新/删除列/重命名

此方法基本上涉及创建要添加到新列的"右侧"的任何现有列的副本,将数据传输到新列,然后删除原始列并重命名新列.这将对您拥有的任何索引或约束造成严重破坏,因为您必须重新指定它们.这在技术上是可行的,但在开发和执行方面又是耗时的.

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
Run Code Online (Sandbox Code Playgroud)

三:和它一起生活

这极大地冒犯了我的秩序感......但有时,它不值得重新洗牌.


tba*_*kan 5

据我所知,没有已知的方法可以更改列的顺序。SQL Management Studio 在幕后执行 Jose Basilio 所说的。如果您有一个大表,那么以这种方式更改列顺序是不切实际的。

您可以使用“视图”。使用 SQL 视图,您可以使用任何您喜欢的顺序,而不会受到表列更改的影响。