将列添加到现有表时,我遇到了这个奇怪的问题。
现有表格如下:
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,它确实有效...逻辑似乎在这里很远。
有谁能告诉我这里我做错了什么?
答案 0 :(得分:4)
将sp_tableoption
存储过程'large value types out of row'
选项设置为ON以将该字段存储在页面之外。
答案 1 :(得分:2)
nvarchar
字段的最大大小为MAX
,为4000个字符(2字节Unicode字符)。
In SQL Server 2000 and SQL Server 7,a 行的大小不能超过8000个字节。 这意味着
VARBINARY
列可以 只存储8000个字节(假设它是 一个表中唯一的一列,VARCHAR
列最多可以存储8000个字符 并且NVARCHAR
列最多可以存储 4000个字符(每个unicode 2个字节 字符)。这种限制源于 8 KB内部页面大小SQL Server 用于将数据保存到磁盘。
如果您需要存储较长的文本,则应使用text
或ntext
,这样可以容纳与系统硬盘空间一样多的文本。
您似乎尝试创建一个大小大于的行,而不是可能的大小,这不是有效的操作。
答案 2 :(得分:1)
在SQL Server 2005/2008中,页面大小相同(8K),但数据库使用页面中行上的指针指向包含更大字段的其他页面。这允许2005年克服8K行大小限制。