使用脚本在SQL Server中的其他列之间插入列

Kip*_*Kip 10 sql sql-server scripting

我试图用脚本改变SQL服务器中的表.在过去,我总是通过GUI完成这种事情,但现在我需要生成一个脚本来为客户完成.

我有一个SQL Server数据库表,如下所示:

MyTable
-------
ColA int NOT NULL
ColB int NOT NULL
ColC int NOT NULL
ColD VARCHAR(100)

主键在ColA,ColB和ColC中定义.

我希望SQL脚本像这样更改表:

MyTable
-------
ColA int NOT NULL
ColB int NOT NULL
ColX int NOT NULL  (new column, default 0 for existing data)
ColC int NOT NULL
ColD VARCHAR(100)

主键现在由ColA,ColB,ColX和ColC定义.

这很容易通过SQL Server GUI完成.但是当我从中生成一个脚本时,它似乎不必要地复杂.基本上,脚本使用新模式创建临时表,将旧表中的所有数据,索引和约束复制到临时表中,删除旧表,然后将新表重命名为旧表的名称.另外,它有这样的行:

ALTER TABLE dbo.Tmp_MyTable ADD CONSTRAINT
    MyTable21792984_ColC_DF DEFAULT ((0)) FOR ColC
Run Code Online (Sandbox Code Playgroud)

我担心这些随机数字(即21792984)在所有客户数据库实例上都不一样.它们看起来像SQL服务器在创建对每个实例唯一的数据库时生成的内容.

是否有更直接的方法通过SQL命令更改表?我在网上看过,但我发现的主要是基本的和/或通用的.

更新:根据我收到的答案,看起来困难在于将新列"置于"两列之间.我已经意识到列的顺序并不重要(如果我错了,请随意留下纠正我的答案).在我的例子中,如果我只是将列添加到表的末尾,则更改会更简单,代码中的任何内容都不依赖于特定的列顺序.

Aar*_*ton 11

没有其他方法可以在"现有列"之间的SQL Server表中插入列 - 您需要构建临时表并重建旧表.也就是说,列顺序无关紧要 - 您确定需要按顺序插入列吗?

可能最好的办法是只使用GUI,编写脚本,然后将约束名称更改为脚本中合理的内容.您是正确的,数字约束名称并不理想,并且允许SQL Server确定您的对象名称不是最佳做法.


kem*_*002 5

如果要在表的中间插入字段,则本质上必须删除当前表并重新创建它,这就是sql server正在执行的操作。

随机数确保约束具有唯一名称。如果保留脚本并在多个数据库上运行它,则它们将都是相同的。如果您要通过gui修改每一个,则是的,它们很可能会有所不同。

要修改主键,您需要做的就是找出主键约束名称并将其删除。只需添加定义主键的新约束即可。这是假设您没有在其他地方将主键列为外键。