如何在 VBA 中正确输入 sql where 子句?

Posted

技术标签:

【中文标题】如何在 VBA 中正确输入 sql where 子句?【英文标题】:How do I properly input an sql where clause in VBA? 【发布时间】: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 对象 【参考方案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"

【讨论】:

以上是关于如何在 VBA 中正确输入 sql where 子句?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中 where 后面可不可以跟上子查询

如何在连接到 MS SQL 服务器的 MS Access“Pass Trough”查询中使用组合框输入正确编写 WHERE 语句

如何在 VBA 访问的子窗体中显示 Select SQL 语句的结果?

sql 查询的正确语法和 WHERE EXISTS 替代方案

VBA SQL 缺少 WHERE 子句的最后一个条件

在access中用vba如何把SQL语句查询到的一个值赋给变量?