选择存在任何数据的表

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

我有访问大型MSSQL DB的权限。该数据库有很多表,但是其中很大一部分是空的。如何查询数据库模式以选择表名(存在任何行)? (实现此功能后,我只想从具有一些数据的这些表中创建ERD)。我没有发现任何相关问题。

sql sql-server tsql ssms
2个回答
6
投票

您可以使用以下快速查询[[但近似查询,只需检查RowCount列即可:

SELECT TableName = t.NAME, SchemaName = s.Name, [RowCount] = p.rows, TotalSpaceMB = CONVERT(DECIMAL(18,2), SUM(a.total_pages) * 8 / 1024.0), UsedSpaceMB = CONVERT(DECIMAL(18,2), SUM(a.used_pages) * 8 / 1024.0), UnusedSpaceMB = CONVERT(DECIMAL(18,2), (SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024.0) FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 GROUP BY t.Name, s.Name, p.Rows ORDER BY [RowCount] DESC
[如果需要实际计数,则必须发出SELECT,该脚本返回包含SELECT且可能是一堆COUNT(*)的多个UNION ALL的脚本。如果您同时访问表或表很大,可能需要很长时间才能完成。

2
投票
如果您进行实际计数,则可以使用动态脚本来执行此操作。请注意,正如@Ezlo所提到的,这将比使用sys.partitions对象的估计计数慢很多(]:

DECLARE @SQL nvarchar(MAX), @CRLF nchar(2) = NCHAR(13) + NCHAR(10); SET @SQL = STUFF((SELECT @CRLF + N'UNION ALL' + @CRLF + N'SELECT N' + QUOTENAME(s.[name],'''') + N' AS SchemaName,' + @CRLF + N' N' + QUOTENAME(t.[name],'''') + N' AS TableName,' + @CRLF + N' COUNT(*) AS TotalRows' + @CRLF + N'FROM ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) FROM sys.schemas s JOIN sys.tables t ON s.schema_id = t.schema_id FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'),1,11,N'') + N';' --SELECT @SQL; --To see the SQL if you want EXEC sp_executesql @SQL;

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