Rechercher : dans
Par :

{SQL Server} Rechercher une valeur ds Table

Dernière réponse le 5 jui 2009 à 00:52:02 dutche, le 2 jui 2009 à 20:43:42 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Firefox 3.0.11

1

HostOfSeraphim, le 2 jui 2009 à 20:45:14

Il s'agit bien de SQL Server ? Pas de MySQL (à tout hasard) ?

Configuration : Linux Debian Lenny / Noyau 2.6.26 / Gnome / ­Iceweasel 3
Connexion Internet : ADSL Orange 8M (Livebox)

Répondre à HostOfSeraphim

2

dutche, le 2 jui 2009 à 20:50:47

Oui il s'agit bien de SQL Serveur 2005

Répondre à dutche

3

HostOfSeraphim, le 2 jui 2009 à 20:52:26

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.

Configuration : Linux Debian Lenny / Noyau 2.6.26 / Gnome / ­Iceweasel 3
Connexion Internet : ADSL Orange 8M (Livebox)

Répondre à HostOfSeraphim

4

dutche, le 2 jui 2009 à 21:01:04

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

Répondre à dutche

5

chuka, le 2 jui 2009 à 21:14:14

Salut,
peut-etre ce lien pourra t'aider!!
http://www.sqlfr.com/...
@+ Sur un malentendu, ca peut marcher!!

Répondre à chuka

7

dutche, le 2 jui 2009 à 23:02:39

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

Répondre à dutche

8

dutche, le 3 jui 2009 à 14:31:42

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

Répondre à dutche

9

chuka, le 3 jui 2009 à 14:49:47

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....
@+ Sur un malentendu, ca peut marcher!!

Répondre à chuka

10

dutche, le 3 jui 2009 à 20:30:51

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

Répondre à dutche

11

chuka, le 4 jui 2009 à 12:10:57

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...
@+
Sur un malentendu, ca peut marcher!!

Répondre à chuka

12

 dutche, le 5 jui 2009 à 00:52:02

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

Répondre à dutche