2009-05-13 7 views
0

J'ai une base de données SQL Server 2000, et je voudrais récupérer des informations récapitulatives pour tous les champs numériques contenus dans les tables utilisateur de la base de données.Requête T-SQL pour récapituler les champs numériques dans un SQL Server 2000 db

je peux récupérer les noms, types de données et tailles avec la requête suivante:

SELECT t.name AS [TABLE Name], 
c.name AS [COLUMN Name], 
p.name AS [DATA Type], 
p.length AS [SIZE] 
FROM dbo.sysobjects AS t 
JOIN dbo.syscolumns AS c 
ON t.id=c.id 
JOIN dbo.systypes AS p 
ON c.xtype=p.xtype 
WHERE t.xtype='U' 
and p.prec is not null 

Comment puis-je aller un peu plus loin, et également la liste la valeur moyenne contenue dans chaque champ? Est-ce que cela peut être fait avec une sous-requête, ou dois-je placer le résultat de cette requête dans un curseur et faire une boucle à travers une deuxième requête de sélection pour chaque colonne?

Répondre

1

Mon meilleur et devinez rapide est à l'aide d'un curseur:

DECLARE @Table varchar(80) 
DECLARE @Column varchar(80) 
DECLARE @Sql varchar(300) 

DECLARE fields CURSOR FORWARD_ONLY 
FOR SELECT t.name AS [Table], c.name AS [COLUMN] 
FROM dbo.sysobjects AS t 
JOIN dbo.syscolumns AS c ON t.id=c.id 
JOIN dbo.systypes AS p ON c.xtype=p.xtype 
WHERE t.xtype='U' 
    and p.name = 'int' 
    and p.prec is not null 

OPEN fields 

FETCH NEXT FROM fields 
INTO @Table, @Column 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = 'SELECT ''' + @Table + '.' + @Column + ''', Avg(' + @Column+ ') FROM ' + @Table 
    EXEC(@Sql) 

    FETCH NEXT FROM fields 
    INTO @Table, @Column 

END 
CLOSE fields 
DEALLOCATE fields 

Une table temporaire devrait fonctionner correctement, aussi. Vous pouvez également ajouter les valeurs Min() et Max(). Espérons que ça aide

+0

Merci - je me suis rendu compte ne sera pas possible dans une seule requête car vous ne pouvez pas construire une sélection à partir de variables - mais n'a pas pensé à surmonter cela avec exec(). Parfait, merci! – meepmeep

0

Il me semble que vous avez besoin d'un outil de profilage. Vous pouvez utiliser Visual Studio 2008 Database Edition ou une alternative Open Source telle que DataCleaner.

+0

D'accord, DataCleaner est un excellent choix. Avec lui, vous découvrirez des choses beaucoup plus intéressantes que tout profileur de données intégré. La dernière version a une meilleure documentation sur la connexion au serveur MS SQL, donc ça devrait être plus facile maintenant: http://datacleaner.eobjects.org/resources/docs/2.4/html/ch10s03.html –

Questions connexes