我正在批量更新 SQL Server 数据库。我正在将所有numeric(38,0)
列更改为int
(是的,SQL Server 脚本是从 Oracle 脚本创建的)。使用 SMO 和 C# (我是一名软件工程师),我设法生成了非常好的脚本,就像SQL Server Management studio那样。除了一个特定问题外,一切都很好:
对于少数表,当我调用它时,ALTER TABLE [myTable] ALTER COLUMN [columnA] INT
它决定也将列从NOT NULL to NULL
. 这当然是一个大问题,因为我需要为那些特定列上的大多数表重新生成主键。
显然,我有很多使用 SMO 的选项来找出哪些列是主键,并在我更新数据类型之后或期间强制它们为 NOT NULL,但我真的很好奇是什么导致了这种情况。
这取决于您对SET ANSI_NULL_DFLT_OFF或SET ANSI_NULL_DFLT_ON的设置(也可以从 SET ANSI_DEFAULTS 中阅读这些以获得其他效果)。
就个人而言,如果我想要 null 或非 null 列而不是依赖于环境设置,我会明确指定此约束。
您可以再次发出此命令,如果列已达到所需的可空性,则忽略该命令。
但是,您还说过,您只需要在它属于主键的地方更改它。这应该与建模/实施阶段的列是否可以为空无关