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

使用脚本在SQL Server中的其他列之间插入列,sql,sql-server,scripting,Sql,Sql Server,Scripting,我正在尝试使用脚本更改SQL server中的表。在过去,我总是通过GUI做这类事情,但现在我需要为客户生成一个脚本 我有一个SQL Server数据库表,如下所示: MyTable ------- ColA int NOT NULL ColB int NOT NULL ColC int NOT NULL ColD VARCHAR(100) ALTER TABLE dbo.Tmp_MyTable ADD CONSTRAINT MyTable21792984_ColC_DF DEFAULT

我正在尝试使用脚本更改SQL server中的表。在过去,我总是通过GUI做这类事情,但现在我需要为客户生成一个脚本

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

MyTable ------- ColA int NOT NULL ColB int NOT NULL ColC int NOT NULL ColD VARCHAR(100)
ALTER TABLE dbo.Tmp_MyTable ADD CONSTRAINT
    MyTable21792984_ColC_DF DEFAULT ((0)) FOR ColC
我担心这些随机数字(即21792984)在所有客户数据库实例上都不相同。它们看起来像SQL server在创建每个实例都是唯一的数据库时生成的东西

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


更新:从我收到的答案来看,困难似乎在于将新专栏“放在”两个专栏之间。我已经意识到,列的顺序其实并不重要(如果我错了,请随时留下答案纠正我)。在我的例子中,如果我只将列添加到表的末尾,更改会简单得多,代码中的任何内容都不依赖于特定的列顺序。

如果要在表的中间插入字段,则必须删除当前表并重新创建它,这正是sql server所做的

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


要修改主键,只需找到主键约束名称并删除它。只需添加一个定义主键的新约束。这是假设您没有将主键列为其他位置的外键 例如,如果要在末尾添加列,则只需执行以下操作:

ALTER TABLE ADD COLUMN ColX int NOT NULL DEFAULT(0)
你可以在它生成的脚本中看到这一点


至于更改主键,可以删除(在所有现有列上)并重新创建它,而无需重写表,但如果它是群集的或不是群集的,则可能会得到不同的脚本。

没有其他方法在SQL Server表“中间”插入列现有列-您需要构建临时表并重建旧表。也就是说,列顺序不重要-您确定需要按顺序插入列吗


您最好的选择可能是使用GUI,编写脚本,然后在脚本中将约束名称更改为合理的名称。您是对的,数字约束名称并不理想,允许SQL Server确定对象名称也不是最佳做法。

获取示例代码并对其进行修改。如果希望列在特定位置着陆,则必须转到临时表重定义/重命名路由。您也可以用这种方式命名索引和约束。

您使用什么工具生成脚本。我使用,它工作得很好。

如果您在
创建表中指定了,
主键(ColA,ColB,ColC)
,您告诉SQL Server您不关心此约束的名称,您永远不必直接引用它——因此SQL Server完全有理由为它生成一些看起来半随机的唯一名称,比如让您担心的
MyTable21792984\u ColC\u DF
(尽管该特定的约束似乎是特定于
ColC
的单列约束,但相同的命名将应用于其他约束)


虽然对于您当前的模式来说,解决这个问题可能为时已晚,但如果您遵循始终命名约束的原则,它将在将来对您有所帮助,因为您将来很可能需要引用约束,因此您希望该名称完全在您的控制之下,就像任何约束的名称一样其他模式对象(表、列等)。在这种情况下,在
创建表
中使用类似
约束PK\u MyTable主键(ColA、ColB、ColC)
的子句会有所帮助。(如果您用于DBA任务的GUI工具不允许您控制这类事情,那么它们不适合DBA使用:找到更好的工具!-)。

依赖任何类型的“自然”或“固有”都不是一种好的做法数据库表中列的顺序。在任何正式生成的查询中,所有列都应按名称引用,以按查询指定的顺序按名称返回列。如果不遵循该规则,将来任何架构更改都将是一场噩梦,因为每次更新数据库架构时都可能需要更改系统代码。


这里唯一烦人的事情是,在用户手工编码的生产/测试/开发数据库上使用
SELECT*FROM…
运行一次性查询,并在列列表的末尾显示您的新列。但是,我相信许多查询工具会让您从某种GUI中重新排序列。

我只想指出一点为什么你永远不想使用GUI在现有表的中间插入一列。当你这样做时,会创建一个新表,从旧表中移动数据,重命名旧表,将新表重命名为旧表名并删除旧表。如果你有一个小数据库,这就够糟糕的了。在生产环境中re表可能相当大,您可能会在几个小时内将用户锁定在无法访问该表的位置。任何数据库设计,如果在添加新列时需要重新排列数据库中的列顺序,则该数据库将面临灾难。尽管有人坚持这样做,这也是选择*的另一个原因也是一个问题
ALTER TABLE ADD COLUMN ColX int NOT NULL DEFAULT(0)
create table person(name varchar2(10),age number);
alter table person add salary number; (now salary is added at last position)
desc person
 name ...
 age  ...
 salary ... so now salary is at the end.
create table employee as select name,salary,age from person;