【问题标题】:How do I properly input an sql where clause in VBA?如何在 VBA 中正确输入 sql where 子句?
【发布时间】:2021-06-17 17:54:58
【问题描述】:

下面代码中的 where 子句给我一个错误。我似乎无法正确使用语法。

    today = Date
    monthBack = today - 30
    strSQL = ""
    strSQL = strSQL + "SELECT *"
    strSQL = strSQL + "FROM PROD.LABOR_ALLOCATION_HIST"
    strSQL = strSQL + "WHERE LaborDate BETWEEN today AND monthBack"

【问题讨论】:

  • 哪一行会报错?错误是什么? VBA?为什么要添加字符串? VBA 不会这样做。
  • 您还需要在行尾添加空格,您当前的代码将显示为 'SELECT *FROM..._HISTWHERE...'
  • 最后一行抛出错误,“BETWEEN 附近的语法不正确”
  • todaymonthBack 不是日期。您需要使用参数化查询和 SqlCommand 对象

标签: sql excel vba


【解决方案1】:

变量的值需要添加到 SQL 中,而不是它们的名称,并且值需要采用适当的格式。

以下代码将以yyyy-mm-dd 格式添加日期。

today = Date
monthBack = today - 30
strSQL = ""
strSQL = strSQL & "SELECT *"
strSQL = strSQL & "FROM PROD.LABOR_ALLOCATION_HIST"
strSQL = strSQL & "WHERE LaborDate BETWEEN '" & Format(today, "yyyy-mm-dd") & "' AND  '" & Format(monthBack, "yyyy-mm-dd") & "'"

【讨论】:

    【解决方案2】:
    today = Date
        monthBack = today - 30
        strSQL = ""
        strSQL = strSQL & "SELECT *" & vbCrLf
        strSQL = strSQL & "FROM PROD.LABOR_ALLOCATION_HIST" & vbCrLf
        strSQL = strSQL & "WHERE LaborDate BETWEEN " & today & " AND " & monthBack
    

    ...但是您需要将 todaymonthBack 转换为包含 SQL 将读取为有效日期的内容的字符串。

    【讨论】:

    • 我猜反对票是公平的。我无法识别字符串中未作为变量播放的变量。我已经更新了我的答案。也许具有最近 VBA 经验的人可以改进我的答案。我已经有 20 年没有做 VBA 了。
    • 否决票是因为您没有提及参数化变量,因此容易受到 sql 注入的影响。不过很高兴删除它
    • 这是 VBA。一旦 Joe User 可以通过 Excel 或 PowerPoint 访问 SQL Server,您就不知道接下来会发生什么。开发者可以是任何人。你不能指望他们知道或关心这些事情。登录应设置权限,以便与 SQL 注入无关。登录不应对数据库造成任何损害或获取任何敏感数据。 (除非您认为 PowerPoint 是用于查看敏感数据的好工具。)如果通过 VBA 进行 SQL 注入是一个问题,您可能需要一个新的 DBA。
    【解决方案3】:

    或者没有变量

    strSQL = " SELECT * FROM PROD.LABOR_ALLOCATION_HIST" & _
             " WHERE DATEDIFF(day,LaborDate,GetDate()) BETWEEN 0 and 30"
    

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      相关资源
      最近更新 更多