Listar tabelas com 0 registros
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.
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
Curtidas 0
Respostas
Wcrivelini
27/10/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...
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...
GOSTEI 0
Doug_chagas
27/10/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...
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?
GOSTEI 0
Wcrivelini
27/10/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
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
GOSTEI 0
Doug_chagas
27/10/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
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.
GOSTEI 0