En fait j'aimerais renvoyer toutes les lignes contenant la valeur "X" dans le Champ "Chp1" pour toutes les tables de ma Base de données contenant ce champ.
Est ce possible, Si Oui Comment
A voir également:
Rechercher une valeur dans une base de données sql server
Sql rechercher une valeur dans une table - Meilleures réponses
Par contre regarde si il y aurait dans la base master une table ou une vue répertoriant l'ensemble des bases/tables existantes sur le serveur, un peu à la manière de la table information_schema de MySQL.
L'idée serait de récupérer de cette facon la liste des tables disposant d'un champ 'X' et d'exécuter une requête pour tous les résultats retournés.
En fait il y a bel et bien une table système qui contient tous les objets de la BD,
j'ai fait la requête suivant: Select * From sys.Objects Where Type='U' Et cela me renvoie toutes mes tables utilisateurs, le hic c'est que je sais plus comment m'y prendre pour rechercher celles qui ont ce champ X.
De plus il ya aussi la table qui contient tous les champs qui existent dans la BD
Select * from sys.columms, mais là encore j'arrive pas à les lier à mes tables. Puisqu'il n' y a pas de champ qui fait référence (à ma connaissance) aux tables .
Merci à toi chuka pour le lien, il m'a permis d'avoir des idées, mais j'ai tjrs pas eu ce que je veux.
Je réussis à avoir toutes les tables qui comportes le champs 'Chp1' en faisant:
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.xusertype = COLONNES.xusertype
WHERE TABLES.xtype = 'U' AND COLONNES.name='Chp1'
Mais j'arrive tjrs pas à obtenir les lignes de ces tables qui ont la valeur 'X' dans ce champ 'Chp1'.
Je chercher tjrs, mais si vous avez des idées vs pouvez les partager avec moi
Salut,
Je suis pas un expert en mssql, mais si tu fais une procedure dans laquelle tu as réussi à recuperer, par ta requete, les tables et les users, que tu sauvegardes dans une variable, de type curseur, en faisant une boucle sur chaque table, tu devrait obtenir ce que tu veux..
C'est une piste peut-etre....
@+
Merci j'essaie et je verrai ce que ça va me donner.
Mais j'ai un hic je sais pas trop ce que tu appelles une variable curseur???
Je vais chercher de mon côté
Salut,
je sais pas si cela pourra t'aider mais sur oracle, on a un truc du style:
DECLARE
CURSOR c1 IS SELECT table_name FROM sys.USER_TAB_COLUMNS cols WHERE 1=1 AND cols.column_name LIKE '%Nom_DE_LA_Colonne_A_Chercher%';--recup des tables où on a la colonne
curs1 c1%ROWTYPE;
CURSOR c2(tabl IN VARCHAR) IS SELECT column_name FROM sys.USER_TAB_COLUMNS cols WHERE 1=1 AND cols.table_name=tabl;--recup de toutes les colonnes de la tables recupere par le premier curseur
curs2 c2%ROWTYPE;
BEGIN
OPEN c1;
FETCH c1 INTO curs1;
WHILE c1%FOUND LOOP --boucle tant que j'ai des tables
DECLARE
quer VARCHAR(32767);
q VARCHAR(32767);
qu VARCHAR(32767);
BEGIN
quer:='select ';
q:='DBMS_OUTPUT.PUT_LINE(';
OPEN c2(curs1.table_name);--on recuprer les colonnes de la table
FETCH c2 INTO curs2;
WHILE c2%FOUND LOOP --on construit la commande sql dynamique pour récupéré ensuite les données
quer:=quer||' '||curs2.column_name||',';
q:=q||'cTyp.'||curs2.column_name||' ||';
FETCH c2 INTO curs2;
END LOOP;
CLOSE c2;
quer:=SUBSTR(quer,0,INSTR(quer,',',-1,1)-1);
q:=SUBSTR(q,0,INSTR(q,'|',-1,2)-1);
q:=q||');';
quer:=quer||' '||'from '||curs1.table_name||' where mon_champ=valueur;';
qu:='DECLARE CURSOR CurTyp is '||quer||'cTyp CurTyp%ROWTYPE;BEGIN ';
qu:=qu||'OPEN CurTyp;FETCH CurTyp INTO cTyp;';
qu:=qu||'WHILE CurTyp%FOUND LOOP '||q||'FETCH CurTyp INTO cTyp;END LOOP;CLOSE CurTyp;END;';
EXECUTE IMMEDIATE qu;
END;
FETCH c1 INTO curs1;
END LOOP;
CLOSE c1;
END;
En gros, on recupere les tables où tu as la colonne voulue, ensuite on recupere les colonnes de la table, on consrtuit la requete sql et on va afficher le resultat...
Je pense que la syntaxe sera legerement differente en MSSQL, mais tu peux t'en inspirer peut-etre...
@+
ok, je vois qu'avec toi c'est tjrs un pas en avant vers le resultat. tu m'as permis d'arriver jusque là. Je verrai les changements à operer pour que ça marche en MSSQL.
-- Chaine recherchée
set @Chaine_rechercher='TOTO'
DECLARE TABLE_CUR CURSOR FOR
SELECT c.name,o.name FROM syscolumns c, sysobjects o
-- on ne prend que les tables utilisateurs
WHERE o.type='U'
-- lien table colonne
AND c.id=o.id
-- la colonne que l'on cherche
AND c.name LIKE '%domai%'
-- on ne prend que les colonnes qui peuvent contenir des caractères
AND c.xtype IN (167,239,231,35,13,241)
OPEN TABLE_CUR
FETCH NEXT FROM TABLE_CUR
INTO @COL,@TABLE
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlcmd='select * from '+ @TABLE +' where '+@COL+' = '+''''+@Chaine_rechercher+''''
EXEC (@sqlcmd)
END
CLOSE TABLE_CUR
DEALLOCATE TABLE_CUR
C'est un début de réponse car
1- pour chaque table tu vas avoir un résultat même si 0 ligne de renvoier
2- je pense qu'il 'y a une solution plus belle qui serait de passer par un sp_msforeachtable ...