Microsoft Access 中如何删除多个表的内容?

Posted

技术标签:

【中文标题】Microsoft Access 中如何删除多个表的内容?【英文标题】:How to delete contents of mulitple tables in Microsoft Access? 【发布时间】:2013-12-31 15:08:35 【问题描述】:

我需要使用 VBA 清除 Access db 中多个表的内容。

以下是我尝试使用的代码,但它会引发“FROM 子句中的语法错误”。 SQL 语法 (DELETE * FROM [table name];) 在查询中起作用。

Dim tbl As TableDef
Dim sqlstr As String
DoCmd.SetWarnings False

For Each tbl In CurrentDb.TableDefs
    If tbl.Name Like "*_drop" Then
        sqlstr = "DELETE * FROM " & tbl.Name
        DoCmd.RunSQL sqlstr
    End If
Next tbl

我发现了一个类似的问题并回答here,但是并没有解决我的问题。

我也尝试过不使用 sqlstr 并收到相同的错误。

For Each tbl In CurrentDb.TableDefs
    If tbl.Name Like "*_drop" Then
        DoCmd.RunSQL "DELETE * FROM " & tbl.Name
    End If
Next tbl

【问题讨论】:

我发现了问题。模组可以删除此问题,因为解决方案与所述问题无关。在调试时,我发现 VBA 模块每次都会在第五张桌子上失败。问题是某些表名有一个“&”字符,导致 SQL 字符串读取不正确。 大多数 VBA 开发人员会告诉您,表和字段名称应该从不包含空格或除严格的字母数字(0-9 和 A-Z)字符之外的任何内容。我无法告诉你我有多少头痛,因为我继承的数据库没有遵循这些简单的规则。相反,我无法告诉你有多少次我在老板眼中看起来像个天才,因为我的东西可以正常工作,而其他编码人员却因为不遵循这些简单的规则而遇到一个又一个的问题。 :o) 【参考方案1】:

您确认这样的查询没有错误。

DELETE * FROM [table name];

但是,您的代码构建的查询不包含 table name。因此,任何包含空格或几乎包含除字母、数字和下划线以外的任何字符的表名都将导致触发该错误的DELETE 语句。如果表名与保留字匹配,也可能触发错误。 (不幸的是,很难准确预测保留字何时会引起麻烦。)将查询中的所有麻烦字用作字段或表名时,将它们括起来会更安全。而对于那些因为是保留字而麻烦的,你可以给它们起别名而不是括号。

但在可行的情况下,最安全的做法是重命名所有此类对象:避免保留字;并且只能使用字母、数字和下划线。

同时,防御性地编写代码以应对问题名称。修改代码以始终将表名括起来。

sqlstr = "DELETE FROM [" & tbl.Name & "]"

【讨论】:

+1 因为你是对的。但是,更好的是,永远不要在你的字段和表名中添加空格! ;o)【参考方案2】:

我认为你只需要 DELETE FROM 没有 *

【讨论】:

我相信 Mike 说我应该尝试: DoCmd.RunSQL "DELETE FROM " & tbl.Name -- 在 SQL 字符串中省略 "*"。无论哪种方式,SQL 都应该工作。有无我都试过了。 Access 很乐意执行DELETE FROMDELETE * FROM。如果要从查询设计器预览数据表视图中受影响的记录,则必须包含 * 以便 Access 知道要显示哪些列。

以上是关于Microsoft Access 中如何删除多个表的内容?的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access - 合并具有相同字段的多个表

如果 Microsoft Access 中存在表,则删除表

Microsoft Access 交叉表查询中显示的多个客户 ID 的计数

无法通过 C# 中的 OleDB 从 Microsoft Access 中删除表的所有行

Microsoft Access 2007 - 查询多个表会产生错误

Microsoft Access 2000 数据库表在删除安全性后不显示