【发布时间】:2010-02-14 18:56:36
【问题描述】:
向现有表添加列时,我遇到了这个奇怪的问题。
现有表格如下:
CREATE TABLE [BinaryAssets].[BinaryAssets](
[BinaryAssetId] [int] IDENTITY(1,1) NOT NULL,
[BinaryAssetStructureId] [int] NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[Created_By] [int] NOT NULL,
[Created_On] [bigint] NOT NULL,
[Modified_By] [int] NOT NULL,
[Modified_On] [bigint] NOT NULL,
[Active] [bit] NOT NULL,
CONSTRAINT [PK_BinaryAsset] PRIMARY KEY NONCLUSTERED
(
[BinaryAssetId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
现在,我尝试执行的 sql 看起来像:
ALTER TABLE BinaryAssets.BinaryAssets ADD
[Version] INT NOT NULL CONSTRAINT DF_BinaryAssets_Version DEFAULT 1
ALTER TABLE BinaryAssets.BinaryAssets
DROP CONSTRAINT DF_BinaryAssets_Version
当我尝试执行时,我得到一个 sqlexception(参见标题)。
现在,我认为我的表没有超过 8060,所以这里有什么问题。奇怪的是,例如,当我将名称从 nvarchar(max) 更改为 nvarchar(100),然后执行我的新 sql,然后将 100 更改回 MAX 时,它确实起作用了……逻辑在这里似乎很遥远。
谁能告诉我我在这里做错了什么?
【问题讨论】:
-
您在需要 nvarchar(max) 的 [Name] 中添加了什么?你不能只使用 nvarchar(100) 吗?
-
我知道答案告诉你 8,000 大小是记录的最大值。但是你怎么能把它调整到最大值,稍后......这只是一个(非常疯狂的)猜测:也许 max 表示“使用所有可用空间”,当你创建它时,sqlserver 正在保留可用空间到目前为止(在考虑其他领域之前)。因此,您可以尝试在最后一个位置创建带有 [Name] 字段的表,看看会发生什么:)(只是为了好玩)
-
嗯,确实可能是这样,但我还是觉得很奇怪。
-
您能否编辑帖子/标签以指示 SQL 7/2000/2005/2008,因为如果 SQL 2000/7 是 2005/2008,则给出的答案将完全不正确
-
我尝试过复制它无济于事 - 即使我专门准备页面并在更改命令之前检查(使用 dbcc ind / dbcc 页面检查我是否处于限制状态)我不能让它抛出错误。您是否还有其他遗漏或应用了一些简化?
标签: sql-server sql-server-2008