SQL对于字符串太长

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。它是一个有效的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

为查询创建一个视图,如下所示

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进行长查询

  • 最初在SSMS中创建查询
  • 创建一个名为SQL查询的工作表
  • 将查询复制并粘贴到SQL查询表中,并删除所有空白行或注释行
  • 将任何变量合并到declare语句中
  • 使用以下宏在SQL查询表中循环

    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
    子句-ie
    ORDER 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中运行。没有足够的权限创建视图:(但谢谢你,我知道那会有用的