为什么在列上运行 ALTER TABLE 会导致它从 NOT NULL 变为 NULL?

Eri*_*ndi 8 sql-server-2005 sql-server-2008 sql-server

我正在批量更新 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,但我真的很好奇是什么导致了这种情况。

gbn*_*gbn 10

这取决于您对SET ANSI_NULL_DFLT_OFFSET ANSI_NULL_DFLT_ON 的设置(也可以从 SET ANSI_DEFAULTS 中读取这些以了解其他效果)。

就个人而言,如果我想要 null 或非 null 列而不是依赖环境设置,我会明确指定此约束。

ALTER TABLE [myTable] ALTER COLUMN [columnA] INT NOT NULL
Run Code Online (Sandbox Code Playgroud)

您可以再次发出此命令,如果列已经处于所需的可空性,则该命令将被忽略。

但是,您还说您只需要在它是主键的一部分的地方更改它。这应该与建模/实现阶段的列是否可以为空无关