2012-03-19 1 views
2

J'ai le SQL suivant à interroger. C'est un SQL valide. Malheureusement, il est trop long pour une chaîne en VBA. Quelqu'un sait d'une solution de contournement pour exécuter cette requête?SQL trop long pour chaîne

SQL = "SELECT A.cust_ky, A.incid_id, A.OPEN_TS, A.CLOSE_TS, A.REC_UPD_TS, B.wrkgp_id, A.CURR_AGNT_KY, A.incid_ttl_dn " _ 
    & "FROM (MAINTBLS.INCID_FAB A INNER JOIN MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky=B.wrkgp_ky) " _ 
    & "WHERE B.wrkgp_id='" & wrkgp & "' And (A.open_fg = 1 OR A.pend_fg = 1)" _ 
    & "ORDER BY A.cust_ky, A.curr_agnt_ky ASC" 

rs.Open SQL, con, adOpenKeyset 
+0

Veuillez ne pas préfixer vos titres avec "VBA -" et ainsi de suite. C'est ce que les tags sont pour. –

+1

Une chaîne dans VBA peut contenir plus de 2 milliards de caractères. Est-ce que votre chaîne est vraiment plus longue que ça? – Guffa

+0

Il s'agit de la valeur de la liste de surveillance après l'exécution de SQL =. "SELECT A.cust_ky, A.IDID_ID, A.OPEN_TS, A.CLOSE_TS, A.REC_UPD_TS, B.wrkgp_id, A.CURR_AGNT_KY, A.incid_ttl_dn FROM (MAINTBLS.WF_INCID_F UNE JOINDRE INTERNE MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky = B.wrkgp_ky) O WH B.wrkgp_id = 'POWEBSTE-MTE-PORTAL' Et (A.ope – Kyle

Répondre

5

Puisque vous utilisez Oracle, vous devez utiliser une variable de liaison au lieu de SQL dynamique, puis définir la valeur dans la collection de paramètres de l'objet de commande. Non seulement cela empêchera l'injection de SQL, mais il optimisera votre requête.

En outre, il semble que votre instruction SQL manque un espace avant la clause order by. Cela pourrait facilement causer votre erreur. Voir ci-dessous - non testé, mais devrait vous donner l'idée.

SQL = "SELECT A.cust_ky, A.incid_id, A.OPEN_TS, A.CLOSE_TS, A.REC_UPD_TS, B.wrkgp_id, A.CURR_AGNT_KY, A.incid_ttl_dn " _ 
    & "FROM (MAINTBLS.INCID_FAB A INNER JOIN MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky=B.wrkgp_ky) " _ 
    & "WHERE B.wrkgp_id= :wrkgp And (A.open_fg = 1 OR A.pend_fg = 1) " _ 
    & "ORDER BY A.cust_ky, A.curr_agnt_ky ASC" 

    With cmd 
    .ActiveConnection = conn 
    .CommandText = SQL 
    .CommandType = adCmdText 
    .Parameters.Append .CreateParameter(, adVarChar, adParamInput, wrkgp) 
    End With 
2

Créer une vue pour la requête, quelque chose comme ça

create view fix_for_broken_vba as 
SELECT A.cust_ky, A.incid_id, A.OPEN_TS, A.CLOSE_TS, A.REC_UPD_TS, B.wrkgp_id, 
     A.CURR_AGNT_KY, A.incid_ttl_dn FROM (MAINTBLS.INCID_FAB A INNER JOIN MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky=B.wrkgp_ky) 
    WHERE (A.open_fg = 1 OR A.pend_fg = 1) 

puis réécrire la requête en conséquence.

+0

Ne pas avoir assez de privilèges pour Create View :(Mais merci, je sais que cela fonctionnerait – Kyle

0

Si vous utilisez VBA dans une feuille Excel, pourquoi ne pas envisager de placer la requête SQL dans une cellule protégée de votre document? Vous pourriez même le mettre dans une feuille cachée de votre document.

Quelque chose comme:

Cells(6, 2).Select 
sqlString = Cells(6, 2).Value 

Je l'ai fait et il fonctionne comme un charme dans mon cas.