一尘不染

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

sql

有没有一种干净的方法来确定表的行大小,然后再向其添加新列并且不超过8060字节限制?

例如,如果表行的长度当前为8055字节,而我想添加一个日期时间(8个字节),则它将遍历,因为它将变为8063字节(不包括空映射)。

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

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

我是否可以使用/开发一个接受两个变量的函数:表名和数据类型:fnIsEnoughStorage(’table1’,int)并从标量函数返回布尔值(是/否)。

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


阅读 158

收藏
2021-05-23

共1个答案

一尘不染

此处的查询将确定哪些表具有潜在的危险,并且可能的最大行大小将超过可用的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字节大小限制。

2021-05-23