{SQL Server} Rechercher une valeur ds Table [Fermé]

Signaler
Messages postés
73
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
21 mai 2010
-
 scaythe -
Bonjour,

SVP j'ai besoin d'aide, Voici mon problème:

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

11 réponses

Messages postés
6746
Date d'inscription
jeudi 2 février 2006
Statut
Contributeur
Dernière intervention
31 juillet 2016
1 489
Il s'agit bien de SQL Server ? Pas de MySQL (à tout hasard) ?

Messages postés
73
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
21 mai 2010

Oui il s'agit bien de SQL Serveur 2005
Messages postés
6746
Date d'inscription
jeudi 2 février 2006
Statut
Contributeur
Dernière intervention
31 juillet 2016
1 489
J'essayerais demain, je n'ai pas SQL Server ici.

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.

Messages postés
73
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
21 mai 2010

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 .

Je sais plus quoi faire
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
372
Salut,
peut-etre ce lien pourra t'aider!!
http://www.sqlfr.com/codes/QUELQUES-REQUETES-UTILES-INTERROGER-TABLES-SYSTEMES-MSSQL_31587.aspx
@+
Messages postés
73
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
21 mai 2010

Ok je vais voir, je pense qu'il ya des choses interessantes à regardes sur cette page.
Encore merci d'avance!

S'il ya d'autres propositions , elles seront les bien venues
Messages postés
73
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
21 mai 2010

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
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
372
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....
@+
Messages postés
73
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
21 mai 2010

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é

Merci encore
Messages postés
965
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
29 juillet 2010
372
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...
@+
Messages postés
73
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
21 mai 2010

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.

Encore merci pour tout
a tout hasard : un début de réponse

SET NOCOUNT ON

DECLARE
@TABLE VARCHAR(128),
@COL nvarchar(128),
@Chaine_rechercher VARCHAR(500),
@sqlcmd VARCHAR(250)

-- 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 ...