我要查询以下SQL。这是一个有效的SQL。不幸的是,对于VBA中的字符串来说太长了。任何人都知道运行此查询的解决方法吗?
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 :(得分: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
答案 1 :(得分: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)
然后相应地重写查询。
答案 2 :(得分:0)
如果您在Excel工作表中使用VBA,为什么不考虑将SQL查询放在文档的受保护单元格中?您甚至可以将其放在文档的隐藏页中。
类似的东西:
Cells(6, 2).Select
sqlString = Cells(6, 2).Value
我做到了,在我的案例中它就像一个魅力。
答案 3 :(得分:0)
对于100多个行的查询,我使用了以下步骤
在Excel VBA中使用长查询
使用以下宏循环遍历SQL查询表
curl