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

Langage SQL Discussion :

Trouver une valeur sans connaître la table


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Points : 69
    Points
    69
    Par défaut Trouver une valeur sans connaître la table
    Bonjour à tous,

    Je sais qu'il est possible de retrouver les tables possédant un champ recherché.

    Est-il possible de faire un peu la même chose mais pour rechercher une valeur en particulier dans toutes les tables/champs d'une DB?

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Il faudra programmer ceci.

    En partant des tables système tu peux obtenir les différents champs / tables de ton sgbd.

    De la tu peux créer tes requêtes sql et récolter les résultats.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Points : 69
    Points
    69
    Par défaut
    C'est justement à ça que j'étais entrain de penser en utilisant un curseur.

    Merci.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 102
    Points : 69
    Points
    69
    Par défaut
    Pour ceux et celles que ça peut intéresser, voici ma solution:

    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
    93
    94
    95
     
    SET NOCOUNT ON;
     
    -----------------------------------------------------------------------
    --On assigne la valeur recherchée
    -----------------------------------------------------------------------
    DECLARE @ValeurRecherchee VARCHAR(64); SET @ValeurRecherchee = 'MONTREAL'
     
    -----------------------------------------------------------------------
    --On efface les tables temporaire au cas où...
    -----------------------------------------------------------------------
    IF OBJECT_ID('tempdb..#ListeTablesColonnes') IS NOT NULL BEGIN DROP TABLE #ListeTablesColonnes END; 
    IF OBJECT_ID('tempdb..#Resultat') IS NOT NULL BEGIN DROP TABLE #Resultat END; 
     
    -----------------------------------------------------------------------
    --On rempli la table temporaire avec toutes les tables/colonnes
    --N.B.: Je filtre le type de colonne recherchée (VARCHAR et CHAR)
    -----------------------------------------------------------------------
    SELECT	TABLE_NAME, COLUMN_NAME, fait = 0
    INTO	#ListeTablesColonnes
    FROM	INFORMATION_SCHEMA.COLUMNS
    WHERE	DATA_TYPE = 'VARCHAR' OR DATA_TYPE = 'CHAR' 
     
    -----------------------------------------------------------------------
    --Declaration de variables
    -----------------------------------------------------------------------
    DECLARE @sql VARCHAR(512);
    DECLARE @table VARCHAR(128);
    DECLARE @colonne VARCHAR(64);
     
    -----------------------------------------------------------------------
    --Construction de la table des résultats
    -----------------------------------------------------------------------
    CREATE TABLE #Resultat
    (
    	NomTable VARCHAR(128),
    	NomColonne VARCHAR(128)
    )
     
    -----------------------------------------------------------------------
    --Pour chaque table/colonne qui n'ont pas été traité
    -- N.B.: J'utilise le WHILE plutôt qu'un curseur car il paraît
    --       que les curseurs sont instables
    -----------------------------------------------------------------------
    WHILE EXISTS(SELECT	1 FROM #ListeTablesColonnes WHERE fait = 0)
    BEGIN
    	-----------------------------------------------------------------------
    	-- Récupérer la première table/colonne non-traitée
    	-----------------------------------------------------------------------
    	SELECT	TOP 1 @table = TABLE_NAME, @colonne = COLUMN_NAME
    	FROM	#ListeTablesColonnes
    	WHERE	fait = 0
     
    	-----------------------------------------------------------------------
    	--Construit la requête
    	-----------------------------------------------------------------------
    	SET @sql = 'INSERT INTO #Resultat	SELECT	TOP 1 NomTable = ''' + @table + ''', 
    												NomColonne = ''' + @colonne + ''' 
    										FROM	[' + @table + '] 
    										WHERE	CONVERT(VARCHAR,' + @colonne + ') = ''' + @ValeurRecherchee + '''';
     
    	-----------------------------------------------------------------------
    	--Exécute la requête avec gestion d'erreur
    	--N.B.: Je traite l'erreur 916 car je n'ai pas accès à certaines tables
    	-----------------------------------------------------------------------
    	BEGIN TRY
    		EXEC (@sql)
    	END TRY
     
    	BEGIN CATCH
    		IF ERROR_NUMBER() <> 916 --(916 = Erreur d'accès)
    		BEGIN
    			PRINT CONVERT(VARCHAR, ERROR_NUMBER()) + ': ' + ERROR_MESSAGE();
    		END
    	END CATCH
     
    	-----------------------------------------------------------------------
    	--Marque la ligne comme fait
    	-----------------------------------------------------------------------
    	UPDATE	#ListeTablesColonnes
    	SET		fait = 1
    	WHERE	TABLE_NAME = @table 
    			AND COLUMN_NAME = @colonne;
    END
     
    -----------------------------------------------------------------------
    --Affiche les tables/colonnes où l'on retrouve la valeur
    -----------------------------------------------------------------------
    SELECT * FROM #Resultat;
     
    -----------------------------------------------------------------------
    --Efface les tables temporaires
    -----------------------------------------------------------------------
    IF OBJECT_ID('tempdb..#ListeTablesColonnes') IS NOT NULL BEGIN DROP TABLE #ListeTablesColonnes END; 
    IF OBJECT_ID('tempdb..#Resultat') IS NOT NULL BEGIN DROP TABLE #Resultat END;
    N.B.: Selon le nombre de table, ça peut être long!

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

Discussions similaires

  1. Trouver une valeur dans une table en VBA
    Par Zoethibault dans le forum VBA Access
    Réponses: 4
    Dernier message: 12/11/2008, 08h59
  2. trouver une valeur dans un intervalle
    Par gwenhael dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/09/2006, 11h21
  3. [VBA-E]Methode pour trouver une valeur qui apparait plusieur fois
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/05/2006, 13h11
  4. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 16h48
  5. Sélection d' une valeur max depuis 2 tables
    Par ipeteivince dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/05/2005, 17h37

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