已创建表“accounts”,但其最大行大小超过允许的最大值8060字节

时间:2017-08-17 19:00:12

标签: sql-server sql-server-2012

我有几个表要加密。对于每列,我创建另一列来保存加密值。列类型是varbinary(256)。这没有任何问题。

在调试过程中,我解密了表并删除了这些列。我重复创建列并加密值的存储过程。创建并删除这些列几次后,我得到的最大大小超过了警告。创建列并且数据加密没有问题。如果我删除表并重新创建它,则可以进行另外几次迭代。 我已经尝试了几个具有不同定义且具有相同结果的表格。

如果添加和删除列,表中会留下一些内容。收缩数据库和DBCC CLEANTABLE没有帮助。

发生了什么以及如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

当你在sql server中删除一个列时,它实际上并没有删除 - 这些位(页面)只是被标记为已死并且不会被重用。

这个小例子会告诉你

set nocount on
create table dbo.mytable (bigcolumn nvarchar(3500))
insert into dbo.mytable (bigcolumn) values (replicate('x',3500))
go 50

exec sp_spaceused mytable

--name      rows    reserved    data    index_size  unused
--mytable   50      464 KB      400 KB  16 KB       48 KB

alter table dbo.mytable add bigcolumntoo nvarchar(3500)

exec sp_spaceused mytable
-- you will see the table size is still the same (as we havent populated the new column)
--name      rows    reserved    data    index_size  unused
--mytable   50      464 KB      400 KB  16 KB       48 KB

-- lets drop the original column

alter table dbo.mytable drop column bigcolumn

--check the size of the table and you will see it is still the same 

exec sp_spaceused mytable

--name      rows    reserved    data    index_size  unused
--mytable   50      464 KB      400 KB  16 KB       48 KB

如果您使用专用管理连接登录,那么您将能够在基表中跟踪并查找对象(您的列)。值得注意的是,默认约束等情况也是如此。

如果您想避免这种情况,那么您只需重新设计解决方案。

希望这有帮助