SQL语句中的全局变量

3

我在VBA中有以下代码:

Dim strSQL As String
strSQL = "UPDATE Workstations SET MID = newvalue WHERE MID = tempvalue"
DoCmd.RunSQL strSQL

newvalue和tempvalue都是全局变量,并且已经被设置了值。语法方面,这样写是否正确?或者我漏掉了引号?

1个回答

9

试试这个:

如果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在评论中指出,
MID是一个函数的名称,因此最好在SQL语句中使用括号或别名来表示该字段名称:SET [MID]。

1
“MID”是一个函数名称,因此在SQL语句中最好使用括号或别名来表示该字段名称:“SET [MID]”和“WHERE [MID]”。更好的做法是将该字段重命名为不是保留字的名称。 - HansUp
1
谢谢,@HansUp,你说得有道理。我已经更新了我的回答。 - Dmitry Pavliv
2
如果 newvaluetempvalue 是包含单引号的字符串会发生什么?你应该对它们进行转义,或者更好的方法是改用参数化语句。 - Chris Nielsen
@ChrisNielsen,发现得好! - Dmitry Pavliv
1
非常感谢!你真的深入探讨了这个问题。我可能应该明确指出MID是一个数字字段。再次感谢! - santaaimonce
1
与其使用括号来标记字段/列,最好是使用别名前缀 UPDATE Workstations w SET w.MID,这样可以轻松地扩展到其他服务器,并且您永远不必再担心保留字的问题。 - Fionnuala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接