求SQL Server中导致Excel导入内存错误的Top5最长字段查询语句
SQL Server 定位超长字段查询语句(解决Excel导入内存错误)
需求背景
Excel导入时出现以下内存错误,需定位SQL Server中导致该问题的超长字段:
Memory error: A record (66341 bytes) was encountered that exceeds the maximum page size of the storage object (65528 bytes)
需要遍历指定的100张表,找出每个字段的最长值,返回Top5最长的记录,结果格式要求:
table_name | column_name | field_max_length
查询语句
以下SQL脚本会遍历数据库中目标表的字符类型字段(仅这类字段可能引发超长问题),计算每个字段的最长值长度,最终返回Top5最长的记录:
DECLARE @SQL NVARCHAR(MAX) = '' SELECT @SQL = @SQL + ' SELECT ''' + t.name + ''' AS table_name, ''' + c.name + ''' AS column_name, MAX(LEN(' + QUOTENAME(c.name) + ')) AS field_max_length FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' UNION ALL' FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id JOIN sys.columns c ON t.object_id = c.object_id JOIN sys.types ty ON c.system_type_id = ty.system_type_id WHERE ty.name IN ('VARCHAR', 'NVARCHAR', 'CHAR', 'NCHAR') -- 仅遍历指定的100张表,补充表名到IN子句中 AND t.name IN ('表名1', '表名2', ..., '表名100') -- 移除末尾多余的UNION ALL SET @SQL = LEFT(@SQL, LEN(@SQL) - 10) -- 添加排序和Top5筛选 SET @SQL = @SQL + ' ORDER BY field_max_length DESC OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;' EXEC sp_executesql @SQL
说明
- 脚本仅针对字符类型字段,数值、日期等类型字段不会产生超长字符导致的内存问题
- 需将
IN子句中的占位表名替换为实际要遍历的100张表名称 - 结果按字段最长值降序排列,前5条即为最可能引发导入错误的字段
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

