none
(Visual Studio 2008 – SQL SERVER EXPRESS) Lier la table système MASTER.dbo.sysdatabases avec dbo.sysobjects RRS feed

  • Question

  • Bonjour,

    Ceci me liste les bases de données utilisateur, puis les tables et leurs colonnes

    --Liste les bases du serveur

          SELECT * from MASTER.dbo.sysdatabases

    --Liste des tables utilsteaurs avec leurs colonnes et leurs types

          SELECT TABLES.name,COLONNES.name, TYPES.name FROM dbo.syscolumns as COLONNES

                INNER JOIN dbo.sysobjects as TABLES

                ON TABLES.ID = COLONNES.ID

                INNER JOIN dbo.systypes AS TYPES

                ON TYPES.xtype = COLONNES.xtype

                WHERE TABLES.xtype = 'U'

    Peut-on lier ces deux tables, pour avoir un seul SELECT qui me donne le nom de la base, le nom de la table de cette base, le nom des colonnes de cette table ?

    Comme on l'a fait dans le deuxième select


    Cordialement Sauveur CONSALVI

    lundi 17 décembre 2012 17:04

Réponses

  • Pas de souci. Donc Aurel a donné un lien sur la doc des vues qui exposent les infos d'une base.

    Pour l'instant je ne vois pas trop le contexte. Une base forme normalement un tout indépendant des autres bases donc sauf à faire des UNION, des boucles etc... il va être un peu difficile de faire une requête qui va traiter plusieurs bases d'un coup et le résultat risque d'être difficilement exploitable. Il me semble plus simple de faire un script général pour une base et de le lancer simplement dans la base voulue selon les besoins.

    Eventuellement en utilisant une procédure non documentée :

    EXEC sp_MSForEachDB 'Use ?;select DB_NAME(),* FROM Information_Schema.Columns'

    Eventuellement cerner un peu plus ce que voulez faire permettrait peut-être de mieux vous conseiller (si par exemple le but est de comparer des bases entre elles, un il existe des outils ou cela serait probablement plus simple avec un client Windows que de le faire directement depuis SQL Server etc...).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 19 décembre 2012 12:56
    Modérateur

Toutes les réponses

  • Bonjour Sauveur Consalvi,

    Vos problèmes relève des connaissances SQL je vous conseille le forum qui sera le plus adapté a vos demandes d'aide

    http://social.msdn.microsoft.com/Forums/fr-FR/category/serveurfr

    Un modérateur devrais faire le move de votre problème dans le bon forum, il n'est pas nécessaire de refaire le message dans l'autre forum sauf confirmation du moderateur :)

    A bientot


    Cordialement,


    • Modifié TroxsaEditor lundi 17 décembre 2012 18:28 informations
    lundi 17 décembre 2012 18:26
    Auteur de réponse
  • Bonjour,

    Effectivement, c'est là que j'aurai du poser la question !

    Merci, le déplacement a été fait


    Cordialement Sauveur CONSALVI

    mardi 18 décembre 2012 05:31
  • Bonjour,

    Pas sûr de comprendre le but exact. Si on veut juste ajouter le nom de la base dans le résultat cf la fonction DB_NAME() :

    SELECT DB_NAME(),* FROM sys.objects etc... fera apparaître une colonne avec le nom de la base en cours.

    Si on veut une seule requête qui liste les objets de plusieurs bases, éventuellement on pourrait imaginer de faire qq chose comme :

    SELECT 'MaBase1' AS dbName,* FROM MaBase1.dbo.sysobjects
    UNION ALL SELECT 'MaBase2',* FROM MaBase2.dbo.sysobjects

    pour créer une requête qui va lister les objets de ces deux bases dans un seul jeu de résultat. Cela dépend sans doute de la souplesse dont on aurait besoin et du résultat exact que l'on cherche.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mardi 18 décembre 2012 18:41
    Modérateur
  • Bonjour

    L’idée c’est que vous devez récupérer les  informations pour tous les DB.

    J’ai fait un script pour ça :

    IF object_id('tempdb..#tmp') IS NOT NULL            

          drop table #tmp

               

    create table #tmp (DBName varchar(200), TABLE_NAME varchar(200), COL_NAME varchar(200), Type varchar(200) )

     

    declare @db varchar(100)

    select @db = MIN (name) from  MASTER.dbo.sysdatabases

    ---select @db

    declare  @sql nvarchar(1000)

    while (@db is not null)

    begin

          select @sql = N'SELECT ''' + @db + N''' dbName,  TABLES.name,COLONNES.name, TYPES.name FROM ' + @db + N'.dbo.syscolumns as COLONNES

                             INNER JOIN ' + @db + N'.dbo.sysobjects as TABLES

                            ON TABLES.ID = COLONNES.ID

                            INNER JOIN dbo.systypes AS TYPES

                            ON TYPES.xtype = COLONNES.xtype

                            WHERE TABLES.xtype = ''U'''

           

          insert into #tmp

          exec  (  @sql)

          select @db = MIN (name) from  MASTER.dbo.sysdatabases  where name > @db

    end

    select * from  #tmp

    Essayez de le comprendre, et si vous avez des questions n’hésitez pas de demander.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 19 décembre 2012 08:59
  • Bonjour,

    Merci Patrice Scribe

    Mais, sauf votre respect, cela ne convient pas à mes attentes ..

    J'ai essayé cette synsthaxe, et j'ai deux difficultés

    1 - Je sais faire une première boucle pour "récuperer" le nom des bases, et sait constituer une variable avec le nom de la base trouvé + le nom de la base système cherche, mais ensuite, je ne suis pas arrivé à incorporer cette variable dans le select

    2 - J'ai essayé de mettre en "dur" le nom, mais la base n'est pas trouvée !

    (C'est une base système qui donne les nom de table pour une base, je ne me souvient plus du nom)

    Puisque je trouve dans la documentation la description des colonnes pour chaque table sysyème, j'aimerai trouvé également les joints


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 09:43
  • Bonjour,

    Merci Aurel BERA

    J'ai fais quelque chose du même genre (Coincidence ?)

    SELECT INF.TABLE_CATALOG , TABLES.name 
    				INTO TableTemp
    					FROM dbo.sysobjects as TABLES
    						INNER JOIN information_schema.tables AS INF
    						ON TABLES.name = INF.TABLE_NAME
    							WHERE INF.TABLE_CATALOG = @DataBaseName
    								ORDER BY INF.TABLE_CATALOG, INF.TABLE_NAME

    Je fais une boucle pour "récupérer" dans @DataBaseName toutes les bases

    Mais, comme je l'ai dit à Patrice Scribe, j'aimerais avoir une documentation sur les liens entre les tables système


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 09:50
  • J'ai fait également ceci qui me donne pour une base le nom de de la table, et pour la table ses colonnes

    SELECT INF.TABLE_CATALOG AS [BASE], TABLES.name AS [TABLE], COLONNES.name AS [COLONNE], TYPES.name AS [TYPE]
    		INTO TableTemp
    			FROM dbo.syscolumns as COLONNES
    				INNER JOIN dbo.sysobjects as TABLES 
    				ON TABLES.ID = COLONNES.ID
    				INNER JOIN dbo.systypes AS TYPES
    				ON TYPES.xtype = COLONNES.xtype
    				INNER JOIN information_schema.tables AS INF
    				ON TABLES.name = INF.TABLE_NAME
    					WHERE TABLES.xtype = 'U'
    						ORDER BY INF.TABLE_CATALOG, INF.TABLE_NAME


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 09:57
  • Merci,

    Je vais me pencher dessus.


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 10:55
  • Pas de souci. Donc Aurel a donné un lien sur la doc des vues qui exposent les infos d'une base.

    Pour l'instant je ne vois pas trop le contexte. Une base forme normalement un tout indépendant des autres bases donc sauf à faire des UNION, des boucles etc... il va être un peu difficile de faire une requête qui va traiter plusieurs bases d'un coup et le résultat risque d'être difficilement exploitable. Il me semble plus simple de faire un script général pour une base et de le lancer simplement dans la base voulue selon les besoins.

    Eventuellement en utilisant une procédure non documentée :

    EXEC sp_MSForEachDB 'Use ?;select DB_NAME(),* FROM Information_Schema.Columns'

    Eventuellement cerner un peu plus ce que voulez faire permettrait peut-être de mieux vous conseiller (si par exemple le but est de comparer des bases entre elles, un il existe des outils ou cela serait probablement plus simple avec un client Windows que de le faire directement depuis SQL Server etc...).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 19 décembre 2012 12:56
    Modérateur
  • Bonsoir Patrice,

    Vous avez raison, je veux trop en faire ...

    Il vaut mieux passer par les outils de SQL SERVER, comme je l'ai reconnu dans un autre post, en réponse à Aurel

    Mais comme jen'ai "que" SQL EXPRESS, je bricole ...

    OK, je vous ai fait perdre assez de tempsà tous  comme cela

    Merci pour vos efforts


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 16:49
  • Bonjour,

    Vous trouverez sur ce lien : http://www.microsoft.com/web/websitespark/webpro/ une licence gratuite "SQL Server 2012 Web Edition" et beaucoup d'autre choses gratuite si vous chercher bien :)

    En espérant que cela vous serve


    Cordialement,

    mercredi 19 décembre 2012 17:47
    Auteur de réponse
  • Bonjour,

    Merci bien. Je vais visiter le lien


    Cordialement Sauveur CONSALVI

    jeudi 20 décembre 2012 08:07