编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)

Posted

技术标签:

【中文标题】编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)【英文标题】:ms-access VBA long sql query string line split ( with double quote inline) in editor 【发布时间】:2015-05-14 13:13:16 【问题描述】:

我在 MS-Access 2010 中有一个下面的 sql 查询,它在查询设计窗口中运行良好。现在我想通过 VBA 对其进行编码。

实际查询:

INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER)
SELECT EXC AS MY_EXC,  
SUM(IIF(MASTER_TICKER <> "NULL", 1, 0)) AS MY_MASTER_TICKER,
SUM(IIF(MASTER_CUSIP <> "NULL", 1, 0)) AS MY_MASTER_CUSIP,
SUM(IIF(TL_TICKER <> "NULL", 1, 0)) AS MY_TL_TICKER,
SUM(IIF(TL_CUSIP <> "NULL", 1, 0)) AS MY_TL_CUSIP,
SUM(IIF(FC_CUSIP <> "NULL", 1, 0)) AS MY_FC_CUSIP,
SUM(IIF(FC_TICKER <> "NULL", 1, 0)) AS MY_FC_TICKER
FROM TESTDATA
GROUP BY EXC;

我的 VBA 代码 sn-p:

Dim strSQL As String
 Dim db As Database
 Set db = CurrentDb
strSQL = "INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER) " & _
             "SELECT EXC AS MY_EXC, " & _
             "SUM(IIF(MASTER_TICKER <> "NULL", 1, 0)) AS MY_MASTER_TICKER, " & _
             "SUM(IIF(MASTER_CUSIP <> "NULL", 1, 0)) AS MY_MASTER_CUSIP, " & _
             "SUM(IIF(TL_TICKER <> "NULL", 1, 0)) AS MY_TL_TICKER, " & _
             "SUM(IIF(TL_CUSIP <> "NULL", 1, 0)) AS MY_TL_CUSIP, " & _
             "SUM(IIF(FC_CUSIP <> "NULL", 1, 0)) AS MY_FC_CUSIP, " & _
             "SUM(IIf(FC_TICKER <> "NULL", 1, 0)) As MY_FC_TICKER " & _
             "FROM TESTDATA GROUP BY EXC;"

DoCmd.RunSQL strSQL

不幸的是,由于编辑器中的“NULL”内容而出现错误,并且始终显示为红色。还有其他替代方法吗?因为这些列名也将动态来自选择列表框,所以我必须以参数化的方式创建这个 strSQL。

【问题讨论】:

现在我已经手动将整个内容放在一行中,但它仍然在“NULL”附近给出“编译错误:预期语句结束” 所有字段都有一个值(实际文本说)“NULL”还是它们为 Null - NULL?记住 Null "NULL"。 现在我尝试过像这样使用 ""NULL"" 但仍然无法正常工作... @PaulFrancis,是的,不幸的是,这些字段值本身是“NULL”,用一些东西替换它不是很舒服的主意.. 【参考方案1】:

您似乎将 NULL 作为值混淆了,Null 是无法比较的东西。您可以使用两种变体。一种是,

Dim strSQL As String
Dim db As Database
Set db = CurrentDb
strSQL = "INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER) " & _
         "SELECT EXC AS MY_EXC, " & _
         "SUM(IIF(MASTER_TICKER Is Not Null, 1, 0)) AS MY_MASTER_TICKER, " & _
         "SUM(IIF(MASTER_CUSIP Is Not Null, 1, 0)) AS MY_MASTER_CUSIP, " & _
         "SUM(IIF(TL_TICKER Is Not Null, 1, 0)) AS MY_TL_TICKER, " & _
         "SUM(IIF(TL_CUSIP Is Not Null, 1, 0)) AS MY_TL_CUSIP, " & _
         "SUM(IIF(FC_CUSIP Is Not Null, 1, 0)) AS MY_FC_CUSIP, " & _
         "SUM(IIf(FC_TICKER Is Not Null, 1, 0)) As MY_FC_TICKER " & _
         "FROM TESTDATA GROUP BY EXC;"

DoCmd.RunSQL strSQL

或者您可以使用 IsNull 函数。

如果该值实际上是一个字符串“NULL”,那么您应该使用字符串文字进行比较。 &lt;&gt; 'NULL'

编辑

试试下面的,

Dim strSQL As String
Dim db As Database
Set db = CurrentDb
strSQL = "INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER) " & _
         "SELECT EXC AS MY_EXC, " & _
         "SUM(IIF(MASTER_TICKER <> 'NULL', 1, 0)) AS MY_MASTER_TICKER, " & _
         "SUM(IIF(MASTER_CUSIP <> 'NULL', 1, 0)) AS MY_MASTER_CUSIP, " & _
         "SUM(IIF(TL_TICKER <> 'NULL', 1, 0)) AS MY_TL_TICKER, " & _
         "SUM(IIF(TL_CUSIP <> 'NULL', 1, 0)) AS MY_TL_CUSIP, " & _
         "SUM(IIF(FC_CUSIP <> 'NULL', 1, 0)) AS MY_FC_CUSIP, " & _
         "SUM(IIf(FC_TICKER <> 'NULL', 1, 0)) As MY_FC_TICKER " & _
         "FROM TESTDATA GROUP BY EXC;"

DoCmd.RunSQL strSQL

【讨论】:

我的建议是让 OP 受益于怀疑 - 但这是一个完全有效的观点。 @HansUp,后端可能是 MSSQL,其中 NULL 实际上显示为一个值(肉眼),这可能导致 OP相信将它与“NULL”作为字符串进行比较会起作用吗?我们知道vbNullString &lt;&gt; "Null" 会通过测试。这只是在黑暗中刺伤。但我明白你的意思。 @PaulFrancis 不幸的是 Is Not Null 的结果与预期计数不匹配...我对 NULL 作为值并不感到困惑,但在这种特定情况下,这些字段包含文字字符串“NULL”我需要在计数时绕过,这很痛苦.....现在我可以得到任何解决方案 @PaulFrancis... IsNull 在这种情况下也会给出语法错误...所以需要其他方式 @PaulFrancis... 有没有办法在查询设计窗口中动态传递查询,然后获得所需的结果。 HansUp 的最后一种方法在查询窗口中给出了正确的结果,但不能通过 VBA 工作【参考方案2】:

最后它通过使用 chr$(39) 方式完美地工作:

Dim MYSTR As String
 MYSTR = "NULL"

 'teststrSQL = "SELECT EXC,FC_CUSIP FROM TESTDATA " & _
          "WHERE FC_CUSIP = " & Chr$(39) & MYSTR & Chr$(39)

 finalstrSQL = "SELECT EXC AS MY_EXC, " & _
           "SUM(IIF(MASTER_CUSIP <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_MASTER_CUSIP, " & _
           "SUM(IIF(MASTER_TICKER <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_MASTER_TICKER, " & _
           "SUM(IIF(TL_TICKER <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_TL_TICKER, " & _
           "SUM(IIF(TL_CUSIP <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_TL_CUSIP, " & _
           "SUM(IIF(FC_CUSIP <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_FC_CUSIP, " & _
           "SUM(IIF(FC_TICKER <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_FC_TICKER " & _
           "FROM TESTDATA GROUP BY EXC;"

【讨论】:

【参考方案3】:

你必须使用 ' 而不是 "

【讨论】:

一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 (该帖子至少被一位用户标记,大概是因为他们认为应该删除没有解释的答案。)

以上是关于编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sql语句和vba将数据从MS-Access导入excel power查询?

如何在 VBA 代码中的 ms-access 中执行查询?

如何通过 MS-Access VBA 中的 TextBox.OnKeyUp 属性传递 KeyCode

我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码

VBA (Ms-Access) 从宏调用成员函数

从 VBA (MS-Access) 填写 PDF 表单