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确定您的对象名称不是最佳做法.
如果要在表的中间插入字段,则本质上必须删除当前表并重新创建它,这就是sql server正在执行的操作。
随机数确保约束具有唯一名称。如果保留脚本并在多个数据库上运行它,则它们将都是相同的。如果您要通过gui修改每一个,则是的,它们很可能会有所不同。
要修改主键,您需要做的就是找出主键约束名称并将其删除。只需添加定义主键的新约束即可。这是假设您没有在其他地方将主键列为外键。