日期:2014-05-17  浏览次数:20647 次

被MSSQL耍了
1.建表,报警告,行最大大小超过8060,INSERT和UPDATE可能失败

2.插入数据,报超过8060,插入失败

3.用ALTER TABLE ALTER COLUMN COL_NAME VARCHAR(MAX)把所有字符串列全改成VARCHAR(MAX),其它列长度加起来共320

4.插入数据,报超过8060,插入失败


就这样,被华丽丽的刷了,虽然现在已经解决了,但还是郁闷。


第一个详细解释原因的给250技术分,谨以此分献给MS
------解决方案--------------------
只对于2005 或者以上版本

1、警告是因为有char列存在,因为char 是定长的,所以他会去计算,varchar 是非定长的只要实际存储的数据没有超过这个上限, 就不会有问题,别且这个8060 不会去考虑varchar,搞成0来统计
create table test1
(
    a varchar(1000),
    b char(8000),
    c char(53),
    d varchar(1000)
);
go
--这个只会警告
--但是下面的就会报错
create table test2
(
    a int,
    b char(8000),
    c char(53),
    d varchar(1000)
);
go

2、如果是test1 的情况,那么这里超过了肯定就报错(另外2008 r2 创建的时候无视警告,插入前直接会报错,就算插入的值的长度合计远远不够8060)

3、你的修改肯定是 alter table alter column 语句修改的

如果点表--右键设计--修改数据类型,这样就不存在这个问题了

因为这样修改数据类型的时候,点生成更改脚本 看里面的脚本是新建个表,然后移植数据,在删除原来的表,在重命名刚才的表。所以不要觉得写脚本搞就牛逼哄哄的,点图形界面就很挫了,对于上面来说只要完成他们交给的任务就行,所以怎么快怎么有效的来更方便。


总结: 可能alter table alter column 存在bug 或者什么空间设置等问题吧,我相信微软的人应该肯定早发现这个了,或者说这个不算是什么大问题

另外个人觉得一直研究这些存储问题也没什么意思。