Array
(
)

Listar tabelas com 0 registros

Doug_chagas
   - 27 out 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.

Wcrivelini
   - 27 out 2005

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...

Doug_chagas
   - 28 out 2005


Citação:
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?

Wcrivelini
   - 28 out 2005

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

Doug_chagas
   - 28 out 2005


Citação:
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.