一个更新引发的问题的思考的思考,求助各位了.

唐诗三百首 2011-11-07 09:52:20
加精
做如下更新时,
UPDATE t
SET col= 'Stokke KEEP Complete-Cherry'
where ... -- 符合条件的只有一笔记录.

Msg 511, Level 16, State 1, Procedure xxx, Line 170
Cannot create a row of size 8062 which is greater than the allowable maximum row size of 8060.

查该t.col字段数据类型为varchar(500),且表中所有字段长度总和亦远小于8060,
后跟User联系确认该表曾有个xml字段,后来删除了.
估计是空间分配未回收问题(仅是估计),做表索引重建,问题解决.
DBCC DBREINDEX('t', '', 90)

请问哪位可以解释及重现这个错误?
...全文
2270 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
LQWQJQ 2011-11-14
  • 打赏
  • 举报
回复
引用 8 楼 ap0405140 的回复:

感謝7樓,重現了這個問題.

如何解釋drop column col1後update col3的報錯.

一定要重建索引才行嗎.


正如9楼所说,删除列时其实并没有从数据页中删除该列。
至于为什么重建索引可以,可能就是它触发SQL SERVER真正从数据页中删除该列了。
(可能还存在其他动作也会触发真正的删除吧。)

gawkingdotnet520 2011-11-14
  • 打赏
  • 举报
回复
lzo_ozl 2011-11-14
  • 打赏
  • 举报
回复
真高深啊!!
liuweixuan2011 2011-11-10
  • 打赏
  • 举报
回复
危害太大了,有关部门是不是过问下哈。。。。。。
qq95826202 2011-11-10
  • 打赏
  • 举报
回复
hah哈哈,学习了。。。
aceyan2011 2011-11-10
  • 打赏
  • 举报
回复
有点难度。
kofkyo 2011-11-09
  • 打赏
  • 举报
回复
学习了,初看这个问题只觉得诡异
39L高人啊
juxie1984 2011-11-09
  • 打赏
  • 举报
回复
有道理
geputang 2011-11-09
  • 打赏
  • 举报
回复
hai hao haihao
kfhacker 2011-11-09
  • 打赏
  • 举报
回复
有道理
xiaoxiangqing 2011-11-09
  • 打赏
  • 举报
回复
真的第一次遇到这种问题呢?
xiaolomg 2011-11-09
  • 打赏
  • 举报
回复
这个不懂
中国风 2011-11-08
  • 打赏
  • 举报
回复
樓主這樣的用法本身誤用,挑戰SQL限制
char面對以下限制
SQL的行不能跨多頁,且大小限制是8060個字節,頁大小 8192其中頁頭96個字節,頁尾2個字節,還有幾個保留的字節。

SQL05以上支持行溢出跨多頁,對部分類型沒有限制如varchar/nvarchar/sql_variant/CLR定義類型等。
NBDBA 2011-11-08
  • 打赏
  • 举报
回复
围观

varchar nvarchar字段数据删除后或者drop column后的空间并不马上收回,但是影响到行长度计算并且得出错误结论第一次遇到
gw6328 2011-11-08
  • 打赏
  • 举报
回复

use dbx;
go
drop table t;


create table t(v nvarchar(4000),v1 nvarchar(4000));
go

alter table t add x nvarchar(4000);

insert into t select 'aaasdfdsfds','sadfsadfdsf',replicate('x',4000)
select * from t;

alter table t drop column x;

select * from t;

update t set v=REPLICATE('a',4000),v1=REPLICATE('a',4000)
/*
消息 511,级别 16,状态 1,第 1 行
不能创建大小为 8063 的行,该大小大于所允许的最大行大小 8060。
语句已终止。
*/

exec sp_spaceused t
nzperfect 2011-11-08
  • 打赏
  • 举报
回复
这个机制有时候是挺e心的
gw6328 2011-11-08
  • 打赏
  • 举报
回复
应该是增加了xml字段,删除后空间没回收。
claro 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 perfectaction 的回复:]这个以前关注过,印象中存储引擎那本书也有说,石头哥也做过博文
http://blog.csdn.net/happyflystone/article/details/4923803
[/Quote]刚看了这篇文章,的确是这样。
所有的数据都在内存中进行交互,只要涉及IO的部分,都尽量的避免。在大型数据库中都是需要考虑的。


misterliwei 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ap0405140 的回复:]

感謝7樓,重現了這個問題.

如何解釋drop column col1後update col3的報錯.

一定要重建索引才行嗎.
[/Quote]
正如9楼所说,删除列时其实并没有从数据页中删除该列。
至于为什么重建索引可以,可能就是它触发SQL SERVER真正从数据页中删除该列了。
(可能还存在其他动作也会触发真正的删除吧。)
SQL777 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ap0405140 的回复:]
感謝7樓,重現了這個問題.

如何解釋drop column col1後update col3的報錯.

一定要重建索引才行嗎.
[/Quote]
可以看一下石头锅的存储引擎方面的博客。。,如果是数据列,其实删除列数据仍保存的,

不过完美叔说的,XML存在BOLB中,应该不会出现你这个问题才对,
加载更多回复(27)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧