Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

NB LIGNES PAR TABLE


Information sur la source

Catégorie :Divers Classé sous : ligne, nombre, taille, calculer, table Niveau : Expert Date de création : 14/10/2004 Vu : 4 217

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

Description

Ce code m'avait servi il y a un an pour "mesurer" une base de données en renvoyant pour chaque table le nombre de lignes. Cela permet de parler volumétrie avec des néophytes. En fait ce code génère un script qu'il faut éxécuter.

Je le mets pour l'utilisation du curseur notemment.
 

Source

  • -- Curseur pour le nom des tables
  • Declare @sNomTable nVarChar (150)
  • --Declare @iNbLignes Int
  • Declare curNomTable Cursor For
  • Select sysobjects.name
  • From dbo.sysobjects sysobjects
  • Where xtype = 'U'
  • -- Ouverture du curseur sur la première table.
  • Open curNomTable
  • Fetch Next From curNomTable
  • Into @sNomTable
  • -- Boucle sur les tables
  • While @@FETCH_STATUS = 0
  • Begin
  • -- on affiche un Select pour chaque base, il faudra ensuite éxécuter le résultat.
  • Print ('
  • Select ''' + @sNomTable + ''' As NomTable, Count (*) As NbLignes
  • From [' + LTrim (RTrim (@sNomTable)) +']
  • ')
  • -- table suivante
  • Fetch Next From curNomTable
  • Into @sNomTable
  • -- union ou order by selon que c'est la derniere ligne ou non.
  • If @@FETCH_STATUS <> 0
  • Print (' Order By NbLignes Desc')
  • Else Print (' Union')
  • Print ('')
  • End
  • -- Fermeture du curseur
  • Close curNomTable
  • Deallocate curNomTable
-- Curseur pour le nom des tables
Declare	@sNomTable	nVarChar (150)
--Declare	@iNbLignes 	Int
Declare	curNomTable 	Cursor For
	Select	sysobjects.name
	From 	dbo.sysobjects sysobjects
	Where 	xtype = 'U'

-- Ouverture du curseur sur la première table.
Open	curNomTable
Fetch 	Next From curNomTable
Into	@sNomTable

-- Boucle sur les tables
While	@@FETCH_STATUS = 0
Begin
	-- on affiche un Select pour chaque base, il faudra ensuite éxécuter le résultat.
	Print 	('
		Select	''' + @sNomTable + ''' As NomTable, Count (*) As NbLignes
		From	[' + LTrim (RTrim (@sNomTable)) +']
		')

	-- table suivante
	Fetch Next From curNomTable
	Into	@sNomTable

	-- union ou order by selon que c'est la derniere ligne ou non.
	If	@@FETCH_STATUS <> 0
		Print ('		Order By NbLignes Desc')
	Else	Print ('		Union')
	Print ('')
End

	
-- Fermeture du curseur
Close 	curNomTable
Deallocate curNomTable

Conclusion

ATTENTION: CE CODE GENERE UN SCRIPT QU'IL FAUT EXECUTER!

copiez le code dans un " analiseur de requetes", éxécutez le (F5), récupérez le résultat en le copiant dans une nouvelle fenêtre et éxécutez.
 

Commentaires et avis

signaler à un administrateur
Commentaire de ploubat le 15/10/2004 10:52:35

Un truc sympa c'est la proc sp_msforeachtable pas toujours documentée par MS mais on trouve tout sur le net (Il y a aussi sp_msforeachdb)

Sinon, pour optimiser à la place du count(*) tu peux mettre un count sur le nom d'une colonne ou mieux si tu disposes de PK ou UK utiliser la colonne rows de la table sysindexes

Pascal

signaler à un administrateur
Commentaire de shaiulud le 24/11/2004 20:02:15

juste un commentaire sur le count(*) et l'optimisation

il est à éviter car le moteur sql ramène les lignes avant de les compter.
il est plus judicieux d'utiliser Count (0) As NbLignes

signaler à un administrateur
Commentaire de rastapaye le 24/03/2005 22:02:16

Un curseur INSENSITIVE serait encore mieux.
Un NOLOCK lors du SELECT serait un plus.
Et un @@FETCH_STATUS <> -1 serait finalement parfait

signaler à un administrateur
Commentaire de Benouille le 30/03/2005 14:29:32

> Un curseur INSENSITIVE serait encore mieux.
ah bon? c'est quoi ça?

> Un NOLOCK lors du SELECT serait un plus.
ah bon? c'est quoi ça?

> Et un @@FETCH_STATUS <> -1 serait finalement parfait
ah bon? c'est quoi ça? ... euh je veux dire ah bon? pourquoi ça?

:)

vb nouille, mais aussi SQL NOUILLE!

[b] VBNouille. [/b]

signaler à un administrateur
Commentaire de rastapaye le 31/03/2005 08:39:46

Un curseur INSENSITIVE crée une copie des données dans TempPB et permet de ne pas locker la table.

Dans notre cas c'est une table systeme donc très peu de risque de la locker, mais c'est une bonne habitude à prendre.

Le NOLOCK se place après le nom d'une table. Il permet de lire les données d'une table même si quelqu'un est en train de les modifier. Par example,  un traitement batch fait une épuration de la table des commandes, il y a donc une transaction en cours. Si une personne fait un SELECT sans NOLOCK sur la table, il se retrouve en attante de la fin de la transaction...

Dans notre cas c'est encore une table systeme donc très peu de risque de la locker, mais c'est une bonne habitude à prendre également.

Enfin le FETCH_STATUS <> -1 permet de boucler tant qu'il n'y a plus d'élément dans le CURSEUR. Par contre il faut tester le FETCH_STATUS <> -2 car dans ce cas il y a eu une erreur de lecture.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Nombre de ligne optimal d'une table? sql server 2000 [ par vindavid38 ] ZanTarBonjour est ce quelqu'un saurait s'il y a une taille optimale (en nombre de ligne) pour une table avec SQL server 2000.??merci bcp de rep@+ Compter avec SQL [ par roud59 ] Bonjour (Bonsoir) &#224; vous tous. J'ai pos&#233; une question (par erreur) sur DelphiFR, mais&nbsp;je pense trouver quelqu'un qui pourra m'aider pus Existe-il une fonction qui retourne toujours la dernière ligne d'une table [ par SwatchDev ] La question est dans le titre... "Existe-il une fonction qui retourne toujours la derni&#232;re ligne d'une table"Dans mon cas, &#231;a serait pour fa obtenir le nombre de ligne de plusieures tables dans le meme tableau ? [ par MrdJack ] bonjour, je recherche une facon d'obtenir le nombre de ligne de plusieures tables de ma base de donn&#233;e et r&#233;cup&#233;rer le r&#233;sultat da retourner valeur des champs et le nombre d'enregistrments correspondant dans un table liée [ par the_mouette ] Bonjour tout le monde!bon, le titre n'&#233;tant pas tr&#232;s clair, je vais essayer d'expliquer mieux :de mani&#232;re simple, j'ai une table messag Problème extraire une ligne d'une table [ par bubix ] Bonjour, Comment on peut faire pour extraire les lignes d'une table. Ce que j'aimerais c'est d'extraire en premier la premi&#232;re ligne puis la suiv trou dans ma table oracle [ par bigood69 ] Bonjour,A cause d'une fausse manipulation Jointure externe sur la même table !! [ par tequila1 ] BonjourJe dois effectuer une requ&#234;te avec jointure externe, mais sur la m&#234;me table.Voici&nbsp;l' exemple :select&nbsp; &nbsp; EXTRACT(YEAR_M insertion de nombre de 1 à N [ par ftug ] Bonjour,j'aimerai inserer dans une table des nombre de 1 &#224; N avec le moins de requetes possible ( le serveur SQL est d&#233;j&#224; bien charg&#2 Calculer un Rang suivant 3 critères [ par Seb33300 ] Salut a tous,j'ai du mal a trouver la requete pour calculer un rang :J'ai par exemple une table : MEMBRE(id, points, victoires, defaites) -&gt; points


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,33 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.