SQL Server 2005 - 达到表行大小限制

时间:2011-09-02 04:22:20

标签: sql sql-server sql-server-2005 tsql sqldatatypes

在向表中添加新列并且未超过8060字节限制之前,是否有一种干净的方法来确定表的行大小?

例如,如果表行长度当前是8055字节,并且我想添加一个日期时间(8字节),那么它将会转到8063字节(不包括空映射)。

但是,如果我添加一个整数(4个字节),这将给它8059个字节,这适合表大小(不包括空映射)。

我目前能够获得表的大小,但是我发现很难创建SQL函数来获取数据类型的大小(int,datetime等)以及数据类型是否需要额外的字节用于null映射

是否有一个我可以使用/开发的函数接受两个变量:tablename和datatype:fnIsEnoughStorage('table1',int)并从标量函数返回一个布尔值(是/否)。

如果为true,我将在确定测试后继续执行ALTER TABLE命令。

2 个答案:

答案 0 :(得分:5)

此查询将确定哪些表具有潜在的危险性,并且可能的最大行大小超过可用的8060字节:

;WITH TableRowSizes AS
(
    SELECT 
        t.NAME 'TableName',
        COUNT(1) 'NumberOfColumns',
        SUM (c.max_length) 'MaxRowLength'
    FROM   
        sys.columns c
    INNER JOIN 
        sys.tables t ON c.object_id = t.object_id
    WHERE
        c.user_type_id NOT IN (98, 165, 167, 231)  -- sql_variant, varbinary, varchar, nvarchar
    GROUP BY 
        t.name
)
SELECT *
FROM TableRowSizes
WHERE MaxRowLength > 8060
ORDER BY MaxRowLength DESC

这并不意味着您的行实际使用超过8060字节 - 它只是总结每列可能的最大大小。

如果您想确定当前使用的实际尺寸,您可以通过检查DATALENGTH(colname)函数(而不是使用sys.columns中的理论最大值)来做类似的事情。

更新:根据gbn的响应为我的CTE SELECT添加了一个WHERE子句 - 这些类型不应用于确定该行是否可能突破8060字节大小限制。

答案 1 :(得分:3)

行可以打破8060字节限制,因为varchar / nvarchar列可以overflow

你会收到警告,但是允许。

如果您使用固定长度的olumns打破8060字节限制,则必须垂直分区(例如1:1表)。

请注意,新的int列不会“结束”:磁盘上的结构定义良好,数据将被移动以容纳新的固定长度字段:One Two