数据库MSSQL中的最大值[已关闭]

问题描述 投票:0回答:2

我正在寻找返回数据库中前 5 个最大值的列表的 SQL 查询。像

SELECT TOP(5) * FROM Database

之类的东西

结果将是:

table_name |  column_name | field_max_length

练习是找到导致问题超过最大数据大小的字段,可以从SQL Server加载到Excel中以对以下问题进行排序:

内存错误:遇到超过存储对象最大页面大小(65528 字节)的记录(66341 字节)

为了澄清我正在大海捞针。导致上述错误的数据库中 100 个表的单元格中的最长值。

提前谢谢您

sql sql-server
2个回答
1
投票

这适用于 SQL Server 2017+。如果您使用的是 2016 年,那么您将需要使用“旧”

FOR XML PATH
方法来使用多个子查询。(我不会这样做;2016 年仅提供扩展支持,2014 年几乎结束生命周期,2012 年和如果您使用的是这样的旧版本,那么可能是时候升级了。) 这个“工作原理”是通过创建一个

massive

动态语句,从表中获取每列的最大数据长度,然后对它们进行逆透视,将所有未透视的数据插入到(临时)表中,最后得到TOP (5)。任何需要分隔识别的名称都应该是安全的。如果您不推荐使用数据类型(如

text
),则可能会出错;如果是这样,您将必须省略这些列。 DECLARE @SQL nvarchar(MAX), @CRLF nchar(2) = NCHAR(13) + NCHAR(10); DECLARE @Delimiter nchar(3) = N',' + @CRLF; WITH Statements AS( SELECT CONVERT(nvarchar(MAX),N'') + --Force to MAX N'WITH DataLengths AS(' + @CRLF + N' SELECT N' + QUOTENAME(s.name,'''') + N' AS SchemaName,' + @CRLF + N' N' + QUOTENAME(t.name,'''') + N' AS TableName,' + @CRLF + STRING_AGG(CONVERT(nvarchar(MAX),N'') + --Force to MAX N' MAX(DATALENGTH(' + QUOTENAME(c.name) + N')) AS ' + QUOTENAME(c.name),@Delimiter) + @CRLF + N' FROM ' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name) + N')' + @CRLF + N'SELECT DL.SchemaName,' + @CRLF + N' DL.TableName,' + @CRLF + N' V.ColumnName,' + @CRLF + N' V.MaxColumnLength' + @CRLF + N'FROM DataLengths DL' + @CRLF + N' CROSS APPLY(VALUES' + @CRLF + STRING_AGG(CONVERT(nvarchar(MAX),N'') + --Force to MAX N' (N' + QUOTENAME(c.name,'''') + N',DL.' + QUOTENAME(c.name) + N')',@Delimiter) + N')V(ColumnName,MaxColumnLength);' AS Statement FROM sys.schemas s JOIN sys.tables t ON s.schema_id = t.schema_id JOIN sys.columns c ON t.object_id = c.object_id GROUP BY s.name, t.name) SELECT @SQL = STRING_AGG(Statement,@CRLF) FROM Statements; --PRINT @SQL; --Uncomment to see the first 4,000 bytes of the statement CREATE TABLE #DataLengths (SchemaName sysname, TableName sysname, ColumnName sysname, MaxColumnLength bigint); INSERT INTO #DataLengths (SchemaName,TableName,ColumnName,MaxColumnLength) EXEC sys.sp_executesql @SQL; SELECT TOP(5) SchemaName, TableName, ColumnName, MaxColumnLength FROM #DataLengths ORDER BY MaxColumnLength DESC; DROP TABLE #DataLengths;
    

我有时使用这个查询来查看哪些表是“最大”的,也许不完全是你想要的,但你可以用它作为开始

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.