SQL对于字符串太长
我需要查询以下SQL。它是一个有效的SQL。不幸的是,它对于VBA中的字符串来说太长了。有人知道运行此查询的解决方法吗SQL对于字符串太长,sql,string,oracle,vba,excel,Sql,String,Oracle,Vba,Excel,我需要查询以下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 O
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
为查询创建一个视图,如下所示
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)
然后相应地重写查询。因为您使用Oracle,所以应该使用绑定变量而不是动态SQL,然后在命令对象的参数集合中设置值。它不仅可以防止SQL注入,还可以更好地优化查询 此外,SQL语句在ORDERBY子句之前似乎缺少空格。这很容易导致你的错误。请参阅下文-未经测试,但应该会给你一个想法
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
如果在Excel表中使用VBA,为什么不考虑将SQL查询放在文档的受保护单元格中呢?你甚至可以把它放在文档的隐藏页中
比如:Cells(6, 2).Select
sqlString = Cells(6, 2).Value
我做到了,在我的情况下,它就像一个符咒。我使用了以下步骤进行100多行查询 使用Excel VBA进行长查询
LastRowQ = ThisWorkbook.Sheets("SQL Query").Cells(ThisWorkbook.Sheets("SQL Query").Rows.Count, "B").End(xlUp).Row
Count = 2
Do Until Count > LastRowQ
SQLQTemp = ThisWorkbook.Sheets("SQL Query").Range("B" & Count)
SQLQuery = SQLQuery & " " & SQLQTemp
Count = Count + 1
Loop
SQLDatabaseRS.Open SQLQuery
请不要在标题前加上“VBA-”之类的前缀。这就是标签的用途。VBA中的字符串可以超过20亿个字符。您的字符串真的比这个长吗?这是执行SQL=后监视列表上的值。“选择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 A内部连接MAINTBLS.DEPTMNT B ON A.CURR_wrkgp ky=B.wrkgp_ky),其中B.wrkgp_id='POWEBSTE-MTE-PORTAL'(A.opeFYI,您的
SQL
字符串实际上没有被截断,这可能是因为监视窗口的值字段限制为255个字符。要验证字符串,请将Debug.Print SQL
添加到您的代码中,并在Immediate
窗口中查看结果。FWIW请尝试将ASC
添加到中的每个字段中ORDER BY
子句-ieORDER BY A.cust_ky ASC,A.curr_agnt_ky ASC
在ORDER BY或A.pend_fg=1)“ORDER BY A.cust_ky,A.curr_agnt_ky ASC”
之前缺少一个空格,如果这是SQL的剪切和粘贴,它将不会在VBA中运行。没有足够的权限创建视图:(但谢谢你,我知道那会有用的