尝试在MS Access中执行动态sql字符串时遇到错误(我正在使用VBA编写代码)。
错误:
运行时错误'3075': 查询表达式“11/8/2013'FROM tbl_sample'中的语法错误(缺少运算符)。
这是我的代码:
Sub UpdateAsOfDate()
Dim AsOfDate As String
AsOfDate = Form_DateForm.txt_AsOfDate.Value
AsOfDate = Format(CDate(AsOfDate))
Dim dbs As Database
Set dbs = OpenDatabase("C:\database.mdb")
Dim strSQL As String
strSQL = " UPDATE tbl_sample " _
& "SET tbl_sample.As_of_Date = '" _
& AsOfDate _
& "' " _
& "FROM tbl_sample " _
& "WHERE tbl_sample.As_of_Date IS NULL ;"
dbs.Execute strSQL
dbs.Close
End Sub
我将strSQL传送到MsgBox,这样我就可以看到完成的SQL字符串,看起来它会毫无错误地运行。发生了什么事?
答案 0 :(得分:3)
摆脱& "FROM tbl_sample " _
。 from子句在更新语句中无效。
答案 1 :(得分:2)
将#
日期分隔符包含在 AsOfDate 字符串中。
AsOfDate = Format(Form_DateForm.txt_AsOfDate.value, "\#yyyy-m-d\#")
然后在构建UPDATE
语句时使用预格式化的 AsOfDate 字符串。
strSQL = "UPDATE tbl_sample AS t" & vbCrLf & _
"SET t.As_of_Date = " & AsOfDate & vbCrLf & _
"WHERE t.As_of_Date IS NULL;"
另请注意,我放弃了FROM
子句,因为它在Access UPDATE
中无效,正如其他人所提到的那样。
或者您可以转换为参数查询,并避免处理日期分隔符。
答案 2 :(得分:2)
你真的应该使用参数化查询,因为
dd-mm-yyyy
格式的计算机上破坏日期。 在你的情况下你会使用这样的东西:
Sub UpdateAsOfDate()
Dim db As DAO.Database, qdf As DAO.QueryDef
Dim AsOfDate As Date
AsOfDate = DateSerial(1991, 1, 1) ' test data
Set db = OpenDatabase("C:\Users\Public\Database1.accdb")
Set qdf = db.CreateQueryDef("", _
"PARAMETERS paramAsOfDate DateTime; " & _
"UPDATE tbl_sample SET As_of_Date = [paramAsOfDate] " & _
"WHERE As_of_Date IS NULL")
qdf!paramAsOfDate = AsOfDate
qdf.Execute
Set qdf = Nothing
db.Close
Set db = Nothing
End Sub
答案 3 :(得分:0)
尝试: -
strSQL = " UPDATE t " _
& "SET t.As_of_Date = '" _
& AsOfDate _
& "' " _
& "FROM tbl_sample t " _
& "WHERE t.As_of_Date IS NULL ;"
问题可能是您的Access驱动程序误解了您正在使用的别名(因为它与表名完全匹配)。