【问题标题】:Maximum row size exceeds the allowed maximum of 8060 bytes最大行大小超过了允许的最大值 8060 字节
【发布时间】:2018-12-03 22:02:12
【问题描述】:

在运行 Microsoft SQL Server 2014。更改表后,我收到有关行大小的警告。

ALTER TABLE myTable
    ALTER COLUMN aRandomColumn NVARCHAR(10);

Warning: The table "myTable" has been created, but its maximum row size exceeds the allowed maximum of 8060 bytes. INSERT or UPDATE to this table will fail if the resulting row exceeds the size limit.

该表有 75 列:

  • 13 日
  • 9 位
  • 8 个整数
  • 5 十进制 (18,5)
  • 4 大整数
  • 3钱
  • 19 nvarchar(10)
  • 10 nvarchar(20)
  • 1 个 nvarchar(30)
  • 1 个 nvarchar(40)
  • 2 nvarchar(50)

根据我的计算,nvarchars 占用 1120 个字节,其他列 121 个(不确定,但不会更多)。

这怎么会超过 8060 字节?我怎样才能摆脱这个警告?

尝试用isnull(datalength(myColumnName), 1)对所有列求和,实际数据从未超过600。

找到a similar question,但更改跟踪对我来说是关闭的,所以它没有帮助。在 this question 中找到的也可清洁,但没有帮助。

但是,当我复制表时,新表不会产生此警告。

SELECT * INTO myNewTable FROM myTable;
-- (8561 row(s) affected)
ALTER TABLE myNewTable
    ATLER COLUMN aRandomColumn NVARCHAR(10);
-- Command(s) completed successfully.

【问题讨论】:

    标签: sql-server-2014


    【解决方案1】:

    为我的问题找到了解决方案。

    This question处理同样的问题,并指出解决方案in another location

    这可能是由于以前的更改(尤其是现有列 宽度)仍然反映在底层页面结构中。尝试 重建表或删除/重新创建聚集索引以 回收该空间。

    对我有用的是:

    ALTER TABLE myTable
        ADD CONSTRAINT pk_bigchange PRIMARY KEY (aColumnWithUniqueNonNullValues);
    GO
    ALTER TABLE myTable
        DROP CONSTRAINT pk_bigchange;
    GO
    

    【讨论】:

    • 我确认一个简单的索引重建就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多