【发布时间】:2014-03-21 16:11:17
【问题描述】:
我在 VBA 中有以下代码:
Dim strSQL As String
strSQL = "UPDATE Workstations SET MID = newvalue WHERE MID = tempvalue"
DoCmd.RunSQL strSQL
newvalue 和 tempvalue 都是全局变量,并且已经设置了值。语法明智,这有意义吗?还是我缺少引号?
【问题讨论】:
我在 VBA 中有以下代码:
Dim strSQL As String
strSQL = "UPDATE Workstations SET MID = newvalue WHERE MID = tempvalue"
DoCmd.RunSQL strSQL
newvalue 和 tempvalue 都是全局变量,并且已经设置了值。语法明智,这有意义吗?还是我缺少引号?
【问题讨论】:
试试这个:
如果MID 是数字:
Dim strSQL As String
strSQL = "UPDATE Workstations SET [MID] = " & newvalue & " WHERE [MID] = " & tempvalue
DoCmd.RunSQL strSQL
如果MID 是字符串(如果newvalue/tempvalue 不包含单引号'):
Dim strSQL As String
strSQL = "UPDATE Workstations SET [MID] = '" & newvalue & "' WHERE [MID] = '" & tempvalue & "'"
DoCmd.RunSQL strSQL
如果MID 是字符串(如果newvalue/tempvalue 包含单引号' 就像newvalue="Mike's car"):
Dim strSQL As String
strSQL = "UPDATE Workstations SET [MID] = '" & Replace(newvalue, "'", "''") & "' WHERE [MID] = '" & Replace(tempvalue, "'", "''") & "'"
DoCmd.RunSQL strSQL
如果MID 是日期:
Dim strSQL As String
strSQL = "UPDATE Workstations SET [MID] = #" & newvalue & "# WHERE [MID] = #" & tempvalue & "#"
DoCmd.RunSQL strSQL
感谢@HansUp 在 cmets 中指出,
MID 是函数的名称,因此在 SQL 语句中为该字段名称加上括号或别名会更安全:SET [MID]
【讨论】:
MID 是一个函数的名称,因此在 SQL 语句中为该字段名称加上括号或别名会更安全:SET [MID] 和 WHERE [MID] 更好的是,将字段重命名为不是reserved word 的名称。
newvalue 或tempvalue 是带单引号的字符串,会发生什么?您还应该转义它们,或者更好地切换到参数化语句。
UPDATE Workstations w SET w.MID 作为前缀,而不是括起来字段/列,这可以很好地扩展到其他服务器,您再也不用担心保留字了。