假设我有这个查询:
DECLARE @QueryString NVARCHAR(MAX) ;
SELECT @QueryString = COALESCE(@QueryString + ' UNION ALL ','')
+ 'SELECT '
+ '''' + QUOTENAME(SCHEMA_NAME(sOBJ.schema_id))
+ '.' + QUOTENAME(sOBJ.name) + '''' + ' AS [TableName]
, COUNT(*) AS [RowCount] FROM '
+ QUOTENAME(SCHEMA_NAME(sOBJ.schema_id))
+ '.' + QUOTENAME(sOBJ.name) + ' WITH (NOLOCK) '
FROM sys.objects AS sOBJ
WHERE
sOBJ.type = 'U'
AND sOBJ.is_ms_shipped = 0x0
ORDER BY SCHEMA_NAME(sOBJ.schema_id), sOBJ.name ;
EXEC sp_executesql @QueryString
GO
它提取数据库的所有表,以及每个表上的记录数。
问题很简单,但找不到如何做:) 如何按 TableName 订购?还是行数?
将其放在 order by 子句中会出现错误(即“SCHEMA_NAME”附近的语法不正确。)。
感谢您提供任何花哨的提示。
如前所述,您只需添加
ORDER BY
到动态查询中即可。您不应该使用变量合并来聚合,这是一个记录在案的反模式,并且在存在类似情况的情况下
ORDER BY
通常会给出不正确的结果。相反,只需
STRING_AGG
与WITHIN GROUP
参数一起使用。另请注意连接到
sys.schemas
, 您可以使用sys.tables
而不是sys.objects
直接过滤。另请注意,如果您不介意获得稍微不准确的数字,则有更快的方法来获取完整的表计数。
在旧版本的 SQL Server 上,您没有
STRING_AGG
,因此您需要经典的 hack 来FOR XML PATH
获得相同的东西,并STUFF
删除额外的分隔符。填写后
@QueryString
您可以添加您的ORDER BY
.