如何在 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 附近的语法不正确”today
和 monthBack
不是日期。您需要使用参数化查询和 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
...但是您需要将 today
和 monthBack
转换为包含 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 子句?的主要内容,如果未能解决你的问题,请参考以下文章
如何在连接到 MS SQL 服务器的 MS Access“Pass Trough”查询中使用组合框输入正确编写 WHERE 语句
如何在 VBA 访问的子窗体中显示 Select SQL 语句的结果?