Listar tabelas com 0 registros

27/10/2005

Boa Tarde. Como faço para listar o nome das tabelas que possuem 0 registros? Ou listar nome da tabela e quantidade de registros?

To tentando a um tempão. Listo a tabela com os nomes das tabelas de usuário, mas não consigo listar a quantidade de registros delas. Mesmo com subquerys fazendo counts...

Alguém pode me ajudar?

Valew mesmo.


Doug_chagas

Respostas

27/10/2005

Wcrivelini

bom, eu costumo fazer isso acessando as tabelas de sistema do SQL SERVER.
apesar de muito mal documentadas, as tabelas de sistema não são tão difíceis de se entender como pode parecer à primeira vista.
por exemplo: no caso que vc citou, basta consultar duas tabelas SYSOBJECTS e SYSINDEXES.

SYSOBJECTS traz todos os objetos da base, portanto vamos usar um filtro para trazermos apenas as tabelas de usuário (O.XTYPE = ´U´).

SYSINDEXES traz informação sobre os índices usados e uma das informações adicionais é exatamente o número de registros existentes na tabela.

portanto, um sql parecido com este aqui deve resolver o seu problema (*)

SELECT O.NAME AS TABELA, X.ROWCNT AS NUM_REGISTROS
FROM SYSOBJECTS O INNER JOIN SYSINDEXES AS X ON O.ID = X.ID
WHERE O.XTYPE = ´U´ AND X.ROWCNT = 0


(*) desculpe, não pude testar. minha máquina é nova e ainda não tem SQL instalado ....pois é, caso de ferreiro...


Responder Citar

28/10/2005

Doug_chagas

bom, eu costumo fazer isso acessando as tabelas de sistema do SQL SERVER. apesar de muito mal documentadas, as tabelas de sistema não são tão difíceis de se entender como pode parecer à primeira vista. por exemplo: no caso que vc citou, basta consultar duas tabelas SYSOBJECTS e SYSINDEXES. SYSOBJECTS traz todos os objetos da base, portanto vamos usar um filtro para trazermos apenas as tabelas de usuário (O.XTYPE = ´U´). SYSINDEXES traz informação sobre os índices usados e uma das informações adicionais é exatamente o número de registros existentes na tabela. portanto, um sql parecido com este aqui deve resolver o seu problema (*) SELECT O.NAME AS TABELA, X.ROWCNT AS NUM_REGISTROS FROM SYSOBJECTS O INNER JOIN SYSINDEXES AS X ON O.ID = X.ID WHERE O.XTYPE = ´U´ AND X.ROWCNT = 0 (*) desculpe, não pude testar. minha máquina é nova e ainda não tem SQL instalado ....pois é, caso de ferreiro...


Amigo, retorna varios registros para uma mesma tabela, pq na sysindexes existem vários registros para uma mesma tabela cada um com um valor em rowcnt, qual deles devo utilizar?


Responder Citar

28/10/2005

Wcrivelini

pois é, douglas, eu estava desconfiado que ia esquecer alguma coisa neste sql pelo fato de não testá-lo :(

mas taí: cada registro que vc vê corresponde às estatísticas de um dos índices da tabela. portanto devemos escolher o valor máximo de registros. na prática, este número faz parte das estatísticas da chave primária da tabela (em que cada registro da tabela corresponde a um valor do índice)

SELECT O.NAME AS TABELA, MAX(X.ROWCNT) AS NUM_REGISTROS
FROM SYSOBJECTS O INNER JOIN SYSINDEXES AS X ON O.ID = X.ID
WHERE O.XTYPE = ´U´ AND X.ROWCNT = 0
GROUP BY O.NAME


Responder Citar

28/10/2005

Doug_chagas

pois é, douglas, eu estava desconfiado que ia esquecer alguma coisa neste sql pelo fato de não testá-lo :( mas taí: cada registro que vc vê corresponde às estatísticas de um dos índices da tabela. portanto devemos escolher o valor máximo de registros. na prática, este número faz parte das estatísticas da chave primária da tabela (em que cada registro da tabela corresponde a um valor do índice) SELECT O.NAME AS TABELA, MAX(X.ROWCNT) AS NUM_REGISTROS FROM SYSOBJECTS O INNER JOIN SYSINDEXES AS X ON O.ID = X.ID WHERE O.XTYPE = ´U´ AND X.ROWCNT = 0 GROUP BY O.NAME


SELECT O.NAME AS TABELA, MAX(X.ROWCNT) AS NUM_REGISTROS
FROM SYSOBJECTS O INNER JOIN SYSINDEXES AS X ON O.ID = X.ID
WHERE O.XTYPE = ´U´ --AND X.ROWCNT = 0
GROUP BY O.NAME
HAVING MAX(X.ROWCNT) = 0

Só precisa mudar isso senão ele lista errado. Ai funcionou. Valew mesmo. E realmente, a documentação dessas tabelas é uma merda.


Responder Citar