2012-03-19 25 views
2

次のSQLを照会します。これは有効なSQLです。残念ながら、VBAの文字列では長すぎます。誰でもこのクエリを実行する回避策を知っていますか?SQLの文字列が長すぎます

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

タイトルに「VBA - 」などのプレフィックスを付けないでください。それがタグのためのものです。 –

+1

VBA内の文字列は、20億文字を超えることができます。あなたの弦は本当にそれよりも長いですか? – Guffa

+0

これは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.WF_INCID_F内部結合MAINTBLS.DEPTMNT B ON A.curr_wrkgp_ky = A.window.wrkgp_id = 'POWEBSTE-MTE-PORTAL'とA.ope – Kyle

答えて

5

Oracleを使用しているため、動的SQLではなくバインド変数を使用し、コマンドオブジェクトのパラメータコレクションに値を設定する必要があります。 SQLインジェクションを防ぐだけでなく、クエリを最適化する方が効果的です。

また、SQL文でorder by句の前にスペースがないようです。それは簡単にエラーを引き起こす可能性があります。以下を参照してください - テストされていませんが、あなたにアイデアを与える必要があります。

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

、クエリのビューを作成し、この

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) 

のようなものと、それに応じてクエリを書き直します。

+0

作成ビューのための十分な権限がありません:(しかし、ありがとうtho。私はそれが動作することを知っている – Kyle

0

ExcelシートでVBAを使用している場合、SQLクエリをドキュメントの保護されたセルに配置することを検討してください。文書の隠しシートに置くことさえできます。以下のような

何か:

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

私はそれをしなかったし、それは私の場合は魔法のように動作します。

関連する問題