对于String,SQL太长了

时间:2012-03-19 02:24:47

标签: sql string oracle vba excel-vba

我要查询以下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

4 个答案:

答案 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中使用长查询

  1. 最初在SSMS中创建查询
  2. 创建一个名为SQL查询的工作表
  3. 将查询复制并粘贴到“ SQL查询”表中,并删除所有空白或带注释的行
  4. 将所有变量合并到声明语句中
  5. 使用以下宏循环遍历SQL查询表

    curl
相关问题