Digamos que tenho esta consulta:
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
que extraem todas as tabelas de um banco de dados e o número de registros em cada tabela.
A pergunta é bem fácil, mas não consigo descobrir como fazer :) Como posso fazer o pedido por TableName? Ou RowCount?
Colocá-lo em ordem por cláusula me dá um erro (ou seja, sintaxe incorreta perto de 'SCHEMA_NAME'. ).
Obrigado por qualquer dica sofisticada.
Conforme mencionado, você precisa apenas adicionar
ORDER BY
à consulta dinâmica.Você não deve usar coalescência de variáveis para agregar, é um antipadrão documentado e, na presença de coisas assim,
ORDER BY
geralmente fornece resultados incorretos .Em vez disso, use apenas
STRING_AGG
com umWITHIN GROUP
parâmetro.Observe também o join to
sys.schemas
e você pode usarsys.tables
em vez de filtrarsys.objects
diretamente.Observe também que se você não se importa em obter números um pouco imprecisos, existem maneiras muito mais rápidas de obter contagens completas da tabela.
Em versões mais antigas do SQL Server, você não tem,
STRING_AGG
então precisa do hack clássicoFOR XML PATH
para obter a mesma coisa eSTUFF
eliminar o separador extra.Depois de preencher
@QueryString
você pode adicionar seu arquivoORDER BY
.