5

我知道在 SQL Server 中向包含数据的表中添加列时,该列必须具有 NULL 选项或默认值。否则 SQL Server 会用什么填充新行?

但是,我不知道为什么不能将 NOT NULL 列添加到空表中。我已经在 SQL 2008 的两个实例和 SQL 2005 的一个实例上进行了尝试,没有任何问题。但是,使用 SQL 2000 的客户确实存在此问题。这与 SQL 2000 有关还是您可以关闭的选项。让我们希望这是一个选择。

Select @@Version

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 版权所有 (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1(Build 2600:Service Pack 3)

Select count(*) from actinv

0

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL

Msg 4901, Level 16, State 1, Line 1 ALTER TABLE 只允许添加可以包含空值或指定了 DEFAULT 定义的列。无法将列“BATCHNUMBER”添加到表“ActInv”,因为它不允许空值并且未指定 DEFAULT 定义。

4

4 回答 4

12

SQL Server 2000 不检查空表。您看到的是 SQL Server 2005/2008 的改进。

以下两个步骤过程中的任何一个都将在 SQL Server 2000 中针对空表进行更改:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL CONSTRAINT ActInv_Temp DEFAULT 'foo'
ALTER TABLE [ActInv] DROP CONSTRAINT ActInv_Temp

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NULL 
ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL 
于 2009-06-30T17:27:55.467 回答
0

我无权访问 2000 进行验证,但是您可以添加一个具有命名默认值的列,以便它成功,然后删除命名默认值吗?

于 2009-06-30T17:21:09.780 回答
0

您是否按顺序考虑了以下 2 个问题:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) 
GO

ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL
GO

我认为这也应该适用于 2000 年(我这里只有 2005 年)

于 2009-06-30T17:26:39.320 回答
0

错误消息告诉您无法添加新列,因为它不允许空值并且未指定 DEFAULT 定义。

您需要向不可为空的字段添加默认值,如下所示:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) DEFAULT 'foo' NOT NULL

编辑:我刚刚看到您在单独的 SQL Server 安装(2000 和 2005)上所做的事情。如果表真的是空的,也许最好的解决方案是删除/创建表。这听起来像是 SQL Server 2000 中的一个错误。

于 2009-06-30T17:13:46.107 回答