IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

nombre total des enregistrements [2005]


Sujet :

Administration SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 083
    Points : 271
    Points
    271
    Par défaut nombre total des enregistrements
    Bonjour,
    je veux sortir le nombre des enregistrements dans les tables dont les noms sont dans la table PSRECDEFN.

    donc j'ai lancé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(*) from (SELECT RECNAME FROM PSRECDEFN WHERE RECTYPE = 0 ORDER BY RECNAME)
    Mais je reçois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg 1033, Level 15, State 1, Line 1
    The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
    Merci pour votre aide.

    Idéalement je souhaite avoir sur la même ligne le nom de chaque table. Comment faure ?

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOM      ENREGISTREMENT
    ----      ------------------
    TABLE1  256
    TABLAE2 368
    D'avance merci.

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par big1 Voir le message
    Bonjour,
    je veux sortir le nombre des enregistrements dans les tables dont les noms sont dans la table PSRECDEFN.

    donc j'ai lancé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(*) from (SELECT RECNAME FROM PSRECDEFN WHERE RECTYPE = 0 ORDER BY RECNAME)
    Mais je reçois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg 1033, Level 15, State 1, Line 1
    The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
    Merci pour votre aide.

    Idéalement je souhaite avoir sur la même ligne le nom de chaque table. Comment faure ?

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOM      ENREGISTREMENT
    ----      ------------------
    TABLE1  256
    TABLAE2 368
    D'avance merci.
    Pour le message d'erreur, c'est car vous mettez une clause ORDER BY dans une sous-requête (subqueries dans le message d'erreur).
    Après, je ne pense pas que ce que vous vouliez faire soit possible. Je pense qu'il faudra passer par du sql dynamique si ça doit se faire en une seule étape.
    Si c'est juste pour faire ça manuellement, vous pouvez faire comme ceci :
    Vous exécutez ceci (en l'adaptant à vos besoin... ici j'ai pris toutes les tables du schéma dbo).
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT    
            'SELECT ''' + TABLE_NAME + ''', COUNT(*) FROM ' + TABLE_SCHEMA + '.' + TABLE_NAME
     
    FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'DBO'
    Le résultat sera une liste de requête. Vous copiez-collez ces requêtes dans une nouvelle fenêtre de SSMS et vous aurez votre résultat en les exécutant.
    Kropernic

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 083
    Points : 271
    Points
    271
    Par défaut
    merci.
    Il rend zéro ligne ne rend pas de script compté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (0 row(s) affected)
    Ne devrait-il être possible de sortir les noms et le nombre de lignes d'une suele requête ?

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Pouvez-vous détailler un peu le contexte ?

    Quel est le but de tout ça, et pourquoi le nom des tables pour lesquelles effectuer ce décompte sont-ils dans une table ?

    Quelle est la volumétrie des tables visée ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 083
    Points : 271
    Points
    271
    Par défaut
    Bonjour,
    et merci.
    Il s'agit d'une base de données pour un ERP (PeopleSoft) donc toutes les noms des tables de l'application sont tous dans la table PSRECDEFN (peoplesoft record definition).
    Et le but est de sortir les nombres d'enregistrements.

    Merci d'avance.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    hmm

    Pour afficher sur un tableau de bord, ou autre ?

    Alors vous pourriez faire comme ceci, qui sera probablement moins lourd que des COUNT(*), mais dont les résultats peuvent être non consistant...
    A voir donc si cela est adapté à votre contexte précis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    	RECNAME ,
    	s.row_count AS NbLignes	
    FROM PSRECDEFN
    INNER JOIN	sys.tables t
    	ON t.name = RECNAME
    INNER JOIN 	sys.dm_db_partition_stats s
    	ON s.object_id = t.object_id
    WHERE s.index_id IN(0,1)
    Et à adapter pour prendre en compte le schéma, le cas échéant...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Pour récupérer des infos sur les tables, j' utilise le script suivant qui peut être adapter à ton besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    -- surveillance des bases de données : donne le nombre d'enregistrements par tables
    CREATE TABLE #TableCount ( table_schema varchar(250), table_name varchar(250), card int,
    	ReservedSize_ko int, DataSize_ko int, IndexSize_ko int, UnusedSize_ko int
    	PRIMARY KEY ( table_schema , table_name ) )
     
    CREATE TABLE #spaceused_tab
    	( tableName varchar(100), numberofRows varchar(100), reservedSize varchar(50), 
    		dataSize varchar(50), indexSize varchar(50), unusedSize varchar(50) )
     
    declare @sql2 nvarchar(1500)
    declare @table_schema varchar(255)
    declare @table_name varchar(255)
     
    DECLARE db_cursor CURSOR FOR 
    	select 
    		REQ2 = 'INSERT  #spaceused_tab EXEC sp_spaceused ''' + QUOTENAME(table_schema) + '.' + QUOTENAME(table_name) + ''''
    		, table_schema
    		, table_name
    	from information_schema.tables 
    	where table_type = 'BASE TABLE'
    		--and TABLE_NAME = 'archive_fix_charges'
    	FOR READ ONLY
     
    OPEN db_cursor 
    FETCH NEXT FROM db_cursor INTO @sql2, @table_schema, @table_name
     
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    	TRUNCATE table #spaceused_tab	
    	exec sp_executesql @sql2
     
    	insert #TableCount
    	select @table_schema, @table_name , 
    		numberofRows, 
    		reverse( substring( reverse( reservedSize ) , 4 , 999)),
    		reverse( substring( reverse( dataSize ) , 4 , 999)),
    		reverse( substring( reverse( indexSize ) , 4 , 999)),
    		reverse( substring( reverse( unusedSize ) , 4 , 999))
    	from #spaceused_tab
     
    	FETCH NEXT FROM db_cursor INTO @sql2, @table_schema, @table_name
    END 
    CLOSE db_cursor 
    DEALLOCATE db_cursor
     
    ; WITH SR_col as (
    	select COL.TABLE_CATALOG, COL.TABLE_SCHEMA, COL.TABLE_NAME, COUNT(*) nb_colonnes
    	from INFORMATION_SCHEMA.COLUMNS COL with (nolock)
    	group by COL.TABLE_CATALOG, COL.TABLE_SCHEMA, COL.TABLE_NAME
    ) , SR_Ind AS (
    	select OBJECT_NAME(IND.object_id) name
    		, OBJECT_SCHEMA_NAME(IND.object_id) schema_name
    		, IND.object_id, COUNT(*) nb_indexes
    	from SYS.indexes IND with (nolock)
    	where IND.index_id > 0
    	group by IND.object_id
    )
    SELECT TAB.TABLE_CATALOG, TAB.TABLE_SCHEMA, TAB.TABLE_NAME
    	, max(SR_col.nb_colonnes) nb_colonnes
    	, MAX(case when SR_ind.nb_indexes is null then 0 else SR_ind.nb_indexes end) nb_indexes
    	, sum(case when CNT.CONSTRAINT_TYPE = 'PRIMARY KEY' then 1 else 0 end) PK
    	, sum(case when CNT.CONSTRAINT_TYPE = 'UNIQUE' then 1 else 0 end) UK
    	, sum(case when CNT.CONSTRAINT_TYPE = 'FOREIGN KEY' then 1 else 0 end) FK
    	, sum(case when CNT.CONSTRAINT_TYPE = 'CHECK' then 1 else 0 end) CHK
    	, max(TBC.card) nb_lignes
    	, cast(max(TBC.ReservedSize_ko)/1024. as decimal(12,3)) ReservedSize_Mo
    	, cast(max(TBC.DataSize_ko)/1024. as decimal(12,3)) DataSize_Mo
    	, cast(max(TBC.IndexSize_ko)/1024. as decimal(12,3)) IndexSize_Mo
    	, cast(max(TBC.UnusedSize_ko)/1024. as decimal(12,3)) UnusedSize_Mo
    FROM information_schema.tables TAB with (nolock)
    left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS CNT with (nolock)
    	on CNT.CONSTRAINT_CATALOG = TAB.TABLE_CATALOG
    		and CNT.CONSTRAINT_SCHEMA = TAB.TABLE_SCHEMA
    		and CNT.TABLE_NAME = TAB.TABLE_NAME
    LEFT OUTER JOIN SR_col with (nolock)
    	on SR_col.TABLE_CATALOG = TAB.TABLE_CATALOG
    		and SR_col.TABLE_SCHEMA = TAB.TABLE_SCHEMA
    		and SR_col.TABLE_NAME = TAB.TABLE_NAME
    LEFT OUTER JOIN SR_Ind with (nolock)
    	ON SR_Ind.schema_name = TAB.TABLE_SCHEMA
    		and SR_Ind.name = TAB.TABLE_NAME
    left outer join #TableCount TBC  with (nolock)--order by card desc , table_schema , table_name
    	on TBC.table_schema = TAB.TABLE_SCHEMA COLLATE database_default
    		and TBC.table_name = TAB.TABLE_NAME COLLATE database_default
    WHERE TAB.table_type='BASE TABLE'
    	and TAB.TABLE_NAME not in ( 'dtproperties' , 'sysdiagrams' )
    group by TAB.TABLE_CATALOG, TAB.TABLE_SCHEMA, TAB.TABLE_NAME
    order by ReservedSize_Mo desc, TAB.TABLE_CATALOG, TAB.TABLE_SCHEMA, TAB.TABLE_NAME
     
    drop TABLE #TableCount 
    drop TABLE #spaceused_tab
    GO

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    ... en gardant tout de même à l'esprit que sys.dm_db_partition_stats est une DMV et que l'exactitude du nombre de lignes retournées n'est pas forcément garantie mais dans la plupart des cas cela n'est pas gênant mais ici tout dépend le besoin bien sûr.

    La procédure stockée système sp_spaceused se base également sur la DMV sys.dm_db_partition_stats

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. TOTAL des enregistrements par table
    Par LDDL dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/03/2007, 14h17
  2. Nombre total d'enregistrement dans un Form
    Par pleasewait dans le forum Access
    Réponses: 2
    Dernier message: 28/12/2006, 16h53
  3. [MySQL] afficher le nombre total d'enregistrements
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 21/03/2006, 22h14
  4. [MySQL] LIMIT et nombre total d'enregistrements
    Par titoumimi dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/01/2006, 11h40
  5. Nombre Total d'Enregistrements d'une Requête d'Union
    Par sqlnet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/12/2003, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo