Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/11/2011, 11h59   #1
Nouveau Membre du Club
 
Homme
Inscription : mars 2009
Messages : 94
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mars 2009
Messages : 94
Points : 32
Points : 32
Par défaut Compter des enregistrements pour chaque table

Bonjour,

je cherche à créer une Procédure stockée qui compte les enregistrements de toutes les tables d'une base et qui somme toutes les valeurs de chaque colonne de chaque table.

J'ai attrapé sur le net une procédure qui affiche toutes les tables et colonnes qui marche bien:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
USE [BPI]
GO
/****** Object:  StoredProcedure [dbo].[spOther_ListTablesAndColumns]    Script Date: 11/18/2011 11:50:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[spOther_ListTablesAndColumns]
 
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
SELECT C.Table_Catalog DB,C.Table_Schema, C.Table_Name, Column_Name, Data_Type
 
FROM Information_Schema.COLUMNS C JOIN Information_Schema.TABLES T
 
ON C.table_name = T.table_name
 
WHERE Table_Type = 'BASE TABLE'
 
 
END


J'ai également développé à côté une procédure qui compte les enregistrements d'une table :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
USE [BPI]
GO
/****** Object:  StoredProcedure [dbo].[spOther_CountRecordsTables]    Script Date: 11/18/2011 11:51:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[spOther_CountRecordsTables] 
 
AS
DECLARE @CountTable nvarchar(200)
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
 
    -- Insert statements for procedure here
	SELECT @CountTable=COUNT(*) FROM [tblDistribution_base]
	Print'There are '+@CountTable+' records'
	END

Du coup j'ai essayé de faire une synergie des 2 procédures:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
USE [BPI]
GO
/****** Object:  StoredProcedure [dbo].[spOther_ListCountSumTablesAndColumns]    Script Date: 11/18/2011 11:36:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[spOther_ListCountSumTablesAndColumns]
 
AS
DECLARE @CountTable nvarchar(200)
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
SELECT C.Table_Catalog DB,C.Table_Schema, C.Table_Name, Column_Name, Data_Type, @CountTable=COUNT(*)
 
FROM Information_Schema.COLUMNS C JOIN Information_Schema.TABLES T
 
ON C.table_name = T.table_name
 
WHERE Table_Type = 'BASE TABLE'
 
 
END
Mais cela ne fonctionne pas.

J'ai ce message
Citation:
Msg 141, Level 15, State 1, Procedure spOther_ListCountSumTablesAndColumns, Line 14
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations.
qui me laisse penser que je ne peux pas afficher un calcul à côté des colonnes qui affichent le nom des tables et des colonnes.

Je démarre sous SQL Server et du coup je ne sais pas comment faire. Quelqu'un peut m'aider pour pouvoir compter les enregistrements aussi sommer les valeurs de chaque colonne?

Merci par avance
__________________
MS Excel 2007
MS Access 2003
SQL Server Express 2008 R2
piflechien73 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 12h06   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Vous pouvez passer par les dmv systèmes et vous servir des physical stats sur les indexes...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 12h12   #3
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Quelque chose comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
;
WITH Alltables AS (
SELECT DISTINCT ta.name, pa.rows
FROM sys.TABLES ta
JOIN sys.partitions pa
	ON ta.object_id = pa.object_id
--where 
--	ta.name like '%TMP%'
--	AND ta.name not like '%TEMP%'
)
SELECT 
	name
	,rows AS NbrLignes
FROM Alltables 
ORDER BY name
__________________
Alexandre Chemla - Consultant MS BI chez Masao
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 12h47   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
ou comme ca (si jamais vous avez une table partitionnée) :

Code :
1
2
3
4
5
6
7
8
9
SELECT 
 T.name,
 SUM(P.[rows]) AS [rows]
FROM sys.TABLES AS T
INNER JOIN sys.partitions AS P
 ON T.object_id = P.object_id 
WHERE P.index_id = 0
 OR P.index_id = 1
GROUP BY T.name
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 13h06   #5
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
voici une procédure old school

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
CREATE PROCEDURE P_TableInfos AS 
BEGIN
SET NOCOUNT ON
--> Créer dans la base msdb une table pour stocker les infos des tables et index à auditer
CREATE TABLE #T_AUDIT_TABLES 
  ( 
  [NomTable] nvarchar(100), 
  [NbLignes] nchar(100) NULL, 
  [EspacePrevu] varchar(18) NULL, 
  [TailleData] varchar(18) NULL, 
  [TailleIndex] varchar(18) NULL, 
  [EspaceInutilise] varchar(18)  
  ) ON [PRIMARY] 
-- Se positionner sur la base à auditer  
DECLARE @TabEnCoursTraitement VARCHAR(100),@SQL VARCHAR (100), @DEL VARCHAR (100) 
-- Stocker le nom des tables de la base dans une table temporaire 
CREATE TABLE #LIST_TABLES (nom_table varchar (50)) 
INSERT INTO #LIST_TABLES  
SELECT TABLE_SCHEMA+'.'+TABLE_NAME AS [NomTable] 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE' 
ORDER BY [NomTable] 
-- Tant qu'il y a des lignes dans la table temporaire 
WHILE EXISTS ( SELECT nom_table  
  FROM #LIST_TABLES 
  )  
BEGIN 
--Se positionner sur la 1ère ligne de la table temporaire 
SET @TabEnCoursTraitement = (SELECT TOP 1 nom_table FROM #LIST_TABLES) 
-- Insérer les infos de la table en cours de traitement dans la table qui stocke les infos à auditer  
SET @SQL = 'INSERT INTO #T_AUDIT_TABLES EXEC sp_spaceused '''+ @TabEnCoursTraitement + ''';' 
EXEC (@SQL);  
-- Supprimer la table traitée de la table temporaire 
SET @DEL = 'DELETE FROM #LIST_TABLES WHERE nom_table = '''+ @TabEnCoursTraitement + ''';' 
EXEC (@DEL) 
END 
--Supprimer la table temporaire 
DROP TABLE #LIST_TABLES 
-->AUDIT DES TABLES DE LA BASE DE DONNEES
/****************
-->1. Quelles sont les tables les plus grosses 
SELECT NomTable 
, cast(replace([TailleData],'KB','') as int) AS [TailleData (en Ko)] 
, cast(replace([TailleIndex],'KB','') as int) AS [TailleIndex (en Ko)] 
,cast(replace([EspacePrevu],'KB','') as int) AS [EspaceReservé (en Ko)] 
,cast(replace([EspaceInutilise],'KB','') as int) AS [EspaceInutilisé (en Ko)] 
FROM #T_AUDIT_TABLES 
ORDER BY [TailleData (en Ko)] DESC 
****************/
-->2.Les tables et le nombre de lignes
SELECT NomTable 
, cast([NbLignes] AS int) AS [Nombre de Lignes] 
FROM #T_AUDIT_TABLES 
ORDER BY [Nombre de Lignes] DESC 
 
DROP TABLE #T_AUDIT_TABLES
END
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 13h46   #6
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Il y a ce genre de solution aussi :

Code :
EXEC sp_MSforeachtable 'SELECT ''?'', COUNT(*) FROM ?'
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 18h29   #7
Nouveau Membre du Club
 
Homme
Inscription : mars 2009
Messages : 94
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mars 2009
Messages : 94
Points : 32
Points : 32
Hello à tous,

Merci beaucoup pour vos réponses. Je me rends compte que SQL Server offre bien plus de possibilités qu'Access car il existe donc des fonctions systèmes qui interrogent directement toutes les tables.

J'ai testé toutes les solutions et elles marchent toutes, cependant je n'arrive pas à obtenir le résultat final dans un fichier à plat:

Table - Nb d'enregistrements de la table - Colonne
-----------------------------------------------------------------------

Cela signifie que n fois la table nommée si elle a n colonnes, mais cela me va bien.

Je peux bien sûr croiser le résultat la procédure stockée ci dessous qui liste les tables et colonnes

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
USE [BPI]
GO
/****** Object:  StoredProcedure [dbo].[spOther_ListTablesAndColumns]    Script Date: 11/19/2011 18:23:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
 
ALTER PROCEDURE [dbo].[spOther_ListTablesAndColumns]
 
 
AS
 
BEGIN
 
           -- SET NOCOUNT ON added to prevent extra result sets from
 
           -- interfering with SELECT statements.
 
           SET NOCOUNT ON;
 
SELECT C.Table_Catalog DB,C.Table_Schema, C.Table_Name, Column_Name, Data_Type
 
 
FROM Information_Schema.COLUMNS C JOIN Information_Schema.TABLES T
 
 
ON C.table_name = T.table_name
 
 WHERE Table_Type = 'BASE TABLE'
 
 
END

avec le résultat d'une de vos solutions, mais peut être existe t'il une fonction système qui permet de tout lister en une procédure?

J'ai cherché mais en vain. Merci si là encore quelquún peut m'aider.
__________________
MS Excel 2007
MS Access 2003
SQL Server Express 2008 R2
piflechien73 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 19h40   #8
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
Citation:
Envoyé par piflechien73 Voir le message
Hello à tous,

J'ai testé toutes les solutions et elles marchent toutes, cependant je n'arrive pas à obtenir le résultat final dans un fichier à plat:

Table - Nb d'enregistrements de la table - Colonne
-----------------------------------------------------------------------
Manuellement dans SSMS :

Tapes

EXEC taProcedure

clique-droit > Résultats dans > Résultats dans un fichier

...
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 20h14   #9
Nouveau Membre du Club
 
Homme
Inscription : mars 2009
Messages : 94
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : mars 2009
Messages : 94
Points : 32
Points : 32
Citation:
Envoyé par zinzineti Voir le message
Manuellement dans SSMS :

Tapes

EXEC taProcedure

clique-droit > Résultats dans > Résultats dans un fichier

...
Rebonjour,

Désolé, je n'ai pas été assez clair. Je voulais dire que les solutions jusque là ne donnent pas "Colonne"

Table - Nb d'enregistrements de la table - Colonne
(Ci dessous une copie écran du résultat que j'essaie d'obtenir)

J'ai le nom des tables, le nombre d'enregistrements mais les PS jusque là plus haut ne donnent pas dans le nom des colonnes et les sommes associées.

Quelqu'un peut m'aider?
Images attachées
Type de fichier : jpg Capture.JPG (43,6 Ko, 4 affichages)
__________________
MS Excel 2007
MS Access 2003
SQL Server Express 2008 R2
piflechien73 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h01.


 
 
 
 
Partenaires

Hébergement Web