Pbl sur envoi de rqte SQL

Résolu
Signaler
Messages postés
348
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
6 novembre 2008
-
Messages postés
1
Date d'inscription
jeudi 10 juin 2004
Statut
Membre
Dernière intervention
21 avril 2006
-
bonjour,



je cherche a executer un prog avec une requete sql tres longue :
...
For i = 1 To cpte 'cpte peut etre tres grand (ie > 500) fin_sql IIf(i 1, "code = '" & Replace(tableau(1), "'", "''") & "'", fin_sql & " OR code = '" & Replace(tableau(i), "'", "''") & "'")
Next
rst.Open "SELECT * FROM matable WHERE (" & fin_sql & ");", connexion
...


losque vb6 juge ma requete trop longue, il m'envoie le message d'erreur ci-dessous sur la ligne "rst.open" :
Erreur d'exécution '-2147467259':
La requête est trop complexe.


comment faire passer ma rqte sql malgres le desaccord de vb6 ?
existe t'il une instruction prevue a cet effet ? sinon, quelle est la bidouille la plus propre ?


merci a vous,



alonsyl

6 réponses

Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
18
Salut,

Effectivement, 500 OR, c'est un peu trop.
Peut être qu'en utilisant une liste, essaie toujours :

For i = 1 To cpte fin_sql IIf(i 1, "code IN ('" & Replace(tableau(1), "'", "''") & "'", fin_sql & ", '" & Replace(tableau(i), "'", "''") & "'")
next

fin_sql = fin_sql & ")"

rst.Open "SELECT * FROM matable WHERE " & fin_sql & ";", connexion

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
OK



J'avais pas vu la fin de la requete désolé.



J'ai deux propositions a te faire dans ce cas

fin_sql= "code IN("

fin_sql=fin_sql & join( tableau,',') & ')'

fin_sql = replace(fin_sql, "'", "''")



C'est propre et rapide et maintenable ;-)



--> en resultat

CODE IN ('10',20','40')





Si ca plante encore



Il faut que tu creer une table temporaire

tu inseres tous les codes

et

ta requete devient

for i = 1 to ....

INSERT INTO TEMP_CODE VALuES(table(i))

next i



CODE IN (SELECT CODE FROM TEMP_CODE)

Vidange table

DELETE FROM TEMP_CODE



voila
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
Salut,



Externalise le code de ta requete



Et je conprends pas ta requete



fin_sql = a pas beaucoup de parametre car tu ne concatene pas

fin_sql &=fin_sql



Voila comment exterliser

Le code devient



fin_sql = replace (table(i),'....)



Il n'y a pas besoin de boucle.

Ni du IIF

--> Performance optimale.



Voila
Messages postés
348
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
6 novembre 2008
12
pour nhervagault:

si, je concatene fin_sql IIf(i 1, "code = '" & Replace(tableau(1), "'", "''") & "'", fin_sql & " OR code = '" & Replace(tableau(i), "'", "''") & "'") peut egalement s'ecrire
if i=1 then
fin_sql="code = '" & Replace(tableau(1), "'", "''")
else:
fin_sql=fin_sql & " OR code = '" & Replace(tableau(i), "'", "''") & "'")
end if

etant donne que i =1 to 500 (au mini) => je concatene au moins 500 fois.

merci quand meme
--------------------------------------------------------------------------------------
pour canislapidus:

j'essais de suite et je te dis ce qu'il en est ...

merci a toi.
Messages postés
348
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
6 novembre 2008
12
OK !

marche avec la methode "code in(...)".
je n'ai pas encore teste la 2eme solution (mais ca ne saurait tarder).

mon pc se joint a moi pour vour remercier (car etait a 2 doigts de passer par la fenetre). @+,

alonsyl
Messages postés
1
Date d'inscription
jeudi 10 juin 2004
Statut
Membre
Dernière intervention
21 avril 2006

Merci merci merci merci merci !!! Si simple et si bon, j'en était venu à découper mes requêtes en plusieurs morceaux et à les exécuter à la suite, ce qui pose à nouveau plein de problèmes !!!

Merci encore !!!