CREATE TABLE [t1] ( 
[c1] [char] (36) not null,       --36
[c2] [char] (8000) NULL ,        --8000
[c3] [varchar] (8000) NULL ,     --又8000
[c4] [nvarchar] (4000) NULL      

解决方案 »

  1.   

    在SQL Server2000是.每行最多是8060个字节....如果大于这个..可以尝试投影到多个表中..然后再用JOIN相连..
    也可以使用TEXT/NTEXT类型.
      

  2.   

    现在不是为了解决问题,只是想知道在insert或update的时候,SQLServer都做了些什么事,按什么去计算需要申请的内存的,自己顶一下
      

  3.   

    MSSQL每个页是8k,即8192,除去页头信息开销132,8192-132=8060,也就是一行的大小不能超过一页的大小,这点不和ORACLE一样,一行数据可以跨页,当然ORACLE中是块,从而形成行链接。
    至于怎末申请内存,和这点没太大关系,不过,mssql在进行DML操作时,是要申请内存的,具体可以看看MSSQL的锁内部机制。
      

  4.   

    对了,在楼主的例子里,因为c1和c2都是定长字符类型,无论你插入什么值,都要占据定义的字符数,即:36+8000=8036,
    那么c3和c4是变长字符,变长字符类型在定义时,要预先分配几个字节的空间,然后会根据实际值的大小再分配空间,当然,C3和C4由于不一种变长类型,预分配的也不一样,这样,根据楼主提供的例子,8060-8036=24,24-13=11,那么这11个字节就是预分配给C3和C4字段的空间,上个帖子里,由于该块是该段的第一个块,所以,132个字节里,应该还有段定义占用的字节数,也就是段头的信息,这样这个空间基本就是这个样子:
    132(块头信息+段头信息)+36(为c1分配)+8000(为c2分配)+11(为c3和c4预分配)+13(块内剩余空间)=8192
    至于块头、段头、为VARCHAR和NVARCHAR预分配的具体字节数,我不记得了,大家有机会可以查查看,我有时间也查一下,希望和大家一起讨论。
    当然至于大数据类型(TEXT,IMAGE)的存储和这不一样的。