有没有一种干净的方法可以在向表添加新列之前确定表的行大小,并且不超过 8060 字节的限制?
例如,如果表行长度当前为 8055 字节,并且我想添加日期时间(8 字节),则这将结束,因为它将变为 8063 字节(不包括空映射)。
但是,如果我添加一个整数(4 字节),则会得到 8059 字节,适合表大小(不包括空映射)。
我目前能够获取表的大小,但是我发现很难创建 SQL 函数来获取数据类型(int、datetime 等)的大小以及数据类型是否需要额外的字节来进行空映射。
是否有一个我可以使用/开发的函数接受两个变量:表名和数据类型:fnIsEnoughStorage('table1',int) 并从标量函数返回布尔值(是/否)。
如果为真,我将在测试确定后继续执行 ALTER TABLE 命令。
这里的查询将确定哪些表有潜在危险并且可能具有超过可用字节 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
)
Update:根据 gbn 的响应向我的 CTE SELECT 添加了一个 WHERE 子句 - 这些类型不应用于确定该行是否可能突破 8060 字节大小限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)