Pbl sur envoi de rqte SQL

Résolu
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 - 11 juil. 2005 à 14:56
poquelicot2 Messages postés 1 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 21 avril 2006 - 21 avril 2006 à 15:33
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

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
11 juil. 2005 à 15:16
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
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
11 juil. 2005 à 16:21
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
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
11 juil. 2005 à 15:22
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
0
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 12
11 juil. 2005 à 15:44
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
alonsyl Messages postés 348 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 6 novembre 2008 12
11 juil. 2005 à 17:06
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
0
poquelicot2 Messages postés 1 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 21 avril 2006
21 avril 2006 à 15:33
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 !!!
0