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.
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.
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.
C'est justement à ça que j'étais entrain de penser en utilisant un curseur.
Merci.
Pour ceux et celles que ça peut intéresser, voici ma solution:
N.B.: Selon le nombre de table, ça peut être long!
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager