2009-12-05 1 views
8

Si je connais le nom de la base de données et le nom de la table, comment puis-je trouver les colonnes - nombre de la table à partir de la base de données SQL maître du serveur?Comment trouver le nombre de colonnes de n'importe quelle table dans n'importe quelle base de données à partir de la base de données master du serveur sql?

Quel est le moyen le plus rapide pour trouver le nombre de colonnes d'une table de base de données?

Que pensez-vous des performances de cette requête?

select count(*) from SYSCOLUMNS where id=(select id from SYSOBJECTS where name='Categories') 

Je dois prendre en charge SQL Server 2000 et versions ultérieures.

Répondre

17

Il peut varier légèrement selon la version de SQL Server, mais cela fonctionnera pour 2005:

SELECT 
    COUNT(*) 
FROM 
    <database name>.sys.columns 
WHERE 
    object_id = OBJECT_ID('<database name>.<owner>.<table name>') 

En 2000:

SELECT 
    COUNT(*) 
FROM 
    <database name>.sysobjects o 
INNER JOIN <database name>.syscolumns c ON 
    c.id = o.id 
WHERE 
    o.name = '<table name>' 

Si vous pourriez avoir plusieurs tables avec exactement la même nom de la table sous différents propriétaires, vous devrez en tenir compte. J'oublie le nom de la colonne dans sysobjects à regarder du haut de ma tête.

MISE À JOUR POUR LES VERSIONS RÉCENTS de SQL Server et de la conformité ANSI:

SELECT COUNT(*) 
FROM 
    <database name>.INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_SCHEMA = '<table schema>' AND 
    TABLE_NAME = '<table name>' 
+0

Mais ce poste [http: //www.codeproject .com/KB/database/RefactorTSQLs.aspx] [Essayez de ne pas utiliser COUNT (*) pour obtenir le nombre d'enregistrements dans le tableau] indique que votre requête précédente ne fournit pas toujours un résultat précis. – anonymous

+0

count (*) est précis, relisez l'article – blackanchorage

+0

@TomH: votre première requête pour SQL Server 2005 ne fonctionnera pas, si vous êtes en "maître", et que vous voulez vérifier une table d'une autre base de données. Vous devez utiliser 'OBJECT_ID ('')' pour des résultats précis ... –

6

Que diriez-vous

select count(*) from <database name.information_schema.columns where table_name = '<table_name>' 
7

Vous pourrait (et devrait) faire - essayer d'éviter d'utiliser la vue "sysobjects" - il n'est plus pris en charge et peut être supprimé dans SQL Server 2008 R2 ou version ultérieure.

Au lieu de cela, utilisez l'affichage catalogue « sys » dans la base de données:

SELECT COUNT(*) 
FROM yourdatabase.sys.columns 
WHERE object_id = OBJECT_ID('yourdatabase.dbo.tablename') 

Cela devrait faire l'affaire, et il est probablement le plus facile et le plus rapide de le faire.

+0

Mais supporte-t-il sql server 2000? – anonymous

+0

Non, c'est pour SQL Server 2005 et plus - vous n'avez pas mentionné SQL Server 2000 dans votre message ....... –

+0

Désolé pour cela. Mais j'ai besoin d'une requête qui supporte sql server 2000 et au-delà. – anonymous

1
select Object_name(object_id) as "Object Name", count(*) as "Column Count" from Course_Plannning_Expense.sys.columns 
where Object_name(object_id) not like 'sys%' 
group by object_id 
order by "Column Count" desc 
+0

Bienvenue sur SO! Dans vos réponses, veuillez cibler la question originale. Vous faites référence à des entités non définies par l'énoncé du problème du demandeur. Aussi: Cette réponse apporte-t-elle une valeur ajoutée par rapport aux réponses existantes? – cfi

3

vous pouvez publier quelque chose comme ça,

select count(*) from information_schema.columns where table_name='yourtablename' 
1

Ou vous pouvez voir toutes les tables avec leurs colonnes comptent

SELECT COUNT(column_name) as "column_count", table_name FROM INFORMATION_SCHEMA.COLUMNS GROUP BY table_name ORDER BY "column_count" DESC

Questions connexes