可以在 SQL Server 2008 中重新计算行大小吗?举个例子:
declare @counter int
declare @statement nvarchar(max)
set @counter=0
drop table kua2
create table kua2(id int)
while @counter<307
begin
set @statement = N'alter table kua2 add id'+CAST(@counter as nvarchar(max))+N' nvarchar(max)'
exec (@statement)
set @statement = N'alter table kua2 drop column id'+CAST(@counter as nvarchar(max))
exec (@statement)
set @counter=@counter+1
end
alter index all on kua2 rebuild
dbcc cleantable (0,'kua2',0)
alter table kua2 add id0 int
alter table kua2 add id1 int
alter table kua2 add id2 int
alter table kua2 add id3 int
当我添加 id3 列时,我收到了关于 8060 字节的警告,但该表只有 5 个 int 列,它仍然计算行大小中删除的 nvarchar(max) 列。
唯一有帮助的是重新创建表。但出于几个原因,我不想这样做。有没有办法告诉 SQL Server 以某种方式重新计算行大小?
这是 SQL Server 2012 RC0 中仍然存在的一个错误(尽管是一个相当小的错误)。在connect.microsoft.com报告它
(感谢丹尼先生)。
您只是在重建索引。你应该重建表:
如果没有这个,你的表有 307 个 varchar(max) 列,如果所有列都有内容,这意味着 7368 字节。+616 可变长度数组。+38 字节空位图中。添加到您的 5 个固定大小的 int 列,您的记录大小超过 8060。这几乎是预期的行为,这不是错误。请参阅幕后的 SQL Server 列。
您在 KUA2 表上执行“ALTER INDEX ALL REBUILD”,但它首先没有索引。您无法重建堆。
如果创建临时聚簇索引:
您将强制重组表存储,包括打包元数据。如果您不需要聚簇索引(这很奇怪——您为什么要堆?)那么您可以删除它:
不管你是否放弃它,你都可以添加更多的列而不用担心行大小限制,你也会享受更好的存储效率。