我正在编写一个脚本来保持表模式同步。
是否有详尽的MS SQL表模式操作列表,需要删除和重新创建表以及要重新插入的数据?
答案 0 :(得分:3)
您可能最好不要在CREATE-COPY-DROP-RENAME(CCDR)策略上进行标准化,并且只在您的DDL不需要重建而不是尝试编译详尽列表的几个场景中尝试就地更改。这是此处描述的策略:link。
AFAIK,如果列是:
,则只允许您向现有表添加列(无需重建)在所有其他情况下,如果MSSQL不知道在新添加的列的行中使用什么作为值,或者数据丢失是结果(例如截断),则MSSQL将潜在失败。即使在中间添加了默认列也会强制重建。
为了进一步复杂化,在某些情况下,部署的成功将取决于表中数据的类型,而不仅仅是所涉及的架构。例如,将列长度更改为更大的值(varchar(50) --> varchar(100)
)可能会成功;但是,减少长度只允许 。迁移数据类型更改是另一个棘手的问题。
简而言之,我会始终重建并很少改变。
-
说明影响结果的行内数据:
create table dbo.Yak(s varchar(100));
insert into dbo.Yak
values(replicate('a', 100));
go
-- attempt to alter datatype to 50 (FAIL: String or binary data would be truncated.)
alter table dbo.Yak
alter column s varchar(50);
go
-- shorten the data in row to avoid data loss
delete from dbo.Yak;
insert into dbo.Yak
values(replicate('a', 50));
go
-- again, attempt to alter datatype to 50 (SUCCESS)
alter table dbo.Yak
alter column s varchar(50);
go
select len(s),* from dbo.Yak;
go
--cleanup
drop table dbo.Yak;
go
答案 1 :(得分:1)
在Management Studio中,选择要更改的表,然后右键单击“设计”。更改表设计窗口中列的数据类型(使用int测试为money)。
而不是保存,右键单击窗口并选择“生成更改脚本”。从对话框中复制SQL语句。
*)在以前的版本(SQL2000)中,任何更改都会重新创建整个表(据我记得)。似乎重命名和添加列已针对ALTER TABLE语句进行了优化。
答案 2 :(得分:1)
通过使用Visual Studio数据库项目来管理这类事情,我已经变得非常糟糕。将模式导入项目后,我可以进行任何我想要的更改,VSDP将确定是否可以通过删除对象(例如,使用ALTER)来完成更改,或者是否需要创建新对象和复制值从旧对象(它自动执行)。
计划一些工作,了解如何将其融入您的特定环境和工作流程中,但我发现这些努力非常值得。