4

我想在我的EMP_2表中添加一列。新列将百分比存储为EMP_PCT数字,例如.20%20.0

我试着输入这个方法。但它在ALTER TABLE语句中给出了语法错误。

为什么它不起作用?下面是我正在使用的 SQL:

ALTER TABLE EMP_2
ADD EMP_PCT NUMBER(4,2);
4

4 回答 4

2

访问 DDL 数据类型名称可能难以分类。 NUMBER实际上将字段创建为双精度浮点数。但是,如果您尝试在 之后的括号中包含字段大小、精度或小数位数NUMBER,则会出现语法错误。无论您是从 ADO 还是 DAO 执行,以下语句都会创建一个双字段:

ALTER TABLE MyTable ADD COLUMN EMP_PCT NUMBER;

下一条语句将MyTable精度 = 4 和小数位数 = 2 的小数数据类型列添加到,这意味着它将在小数点左侧最多容纳 2 位,在右侧最多容纳 2 位。

CurrentProject.Connection.Execute "ALTER TABLE MyTable ADD COLUMN EMP_PCT DECIMAL (4,2);"

CurrentProject.Connection以前执行 DDL 语句是因为它是一个 ADO 对象,而 Access SQL 只允许您使用 ADO 创建一个十进制字段。CurrentDb.Execute如果您尝试从 DAO(例如使用 Access 查询设计器或从 Access 查询设计器)执行该语句,则会触发语法错误。有关详细信息,请参阅字段类型参考 - DDL、DAO 和 ADOX 的名称和值

正如@ErikE 解释的那样,Access 的十进制类型是有问题的,尤其是您正在使用的 Access 2003。考虑您是否可以改用货币类型字段。由于 db 引擎处理固定小数位数的方式,它避免了小数错误并提供更快的性能。

于 2012-12-28T07:40:16.280 回答
1

首先,我建议您不要使用DecimalAccess 2003 中的数据类型,因为在排序(错误的顺序)和聚合(截断小数部分的总和)方面存在错误。在 Access 2007 中,聚合问题得到了解决,但排序问题没有解决(尽管您可以在 Access 2007 中通过在列上放置索引来解决此问题)。

至于你的脚本,有两个明显的问题:

  1. 你必须ADD COLUMN ColumnName不使用ADD ColumnName

  2. 正确的数据类型是DECIMAL,因为NUMBER它创建了一个双精度浮点数,并且在它指定任何类型的大小之后不允许使用括号。(也许 NUMERIC可以作为同义词,DECIMAL但我不知道。)

所以这应该适合你:

ALTER TABLE EMP_2 ADD COLUMN EMP_PCT DECIMAL(4,2);

根据HansUp和其他消息来源,这不能通过 DAO(如CurrentDb.Execute)提交,但必须通过 ADO(CurrentProject.Connection.Execute)完成。

显然,有一种方法可以让这个 SQL 工作,但它需要更改数据库设置:

默认的 Jet 4.0 mdb 文件不支持十进制数据类型。您必须使用 SQL Server 兼容性语法 (ANSI 92) 设置才能在 SQL 窗口中使用十进制数据类型。

单击菜单,工具 > 选项。单击表/查询选项卡。在 SQL Server 兼容性语法 (ANSI 92) 部分中选中“此数据库”复选框。此模式将影响整个数据库,包括使用通配符的查询,因此您可能希望在您的数据库副本上尝试此操作。

如果您仍然无法正常工作,您可以考虑这种方法(感谢 Philippe Grondier):

Dim TD As DAO.TableDef
Dim F As DAO.Field

Set TD = CurrentDb.TableDefs("TableName")
Set F = TD.CreateField("FieldName", dbDecimal, 4)
F.DecimalPlaces = 2
F.DefaultValue = 0

TD.Fields.Append F

作为参考,以下是一些相关的 Microsoft.com 帮助页面:

于 2012-12-28T07:38:03.087 回答
0

尝试这个,

ALTER TABLE EMP_2 
ADD COLUMN EMP_PCT NUMBER(4,2);

或者尝试使用这个 URL,

添加字段

于 2012-12-28T07:25:57.290 回答
0

尝试这个

   ALTER TABLE EMP_2 ADD (EMP_PCT NUMBER (4,2));
于 2012-12-28T07:27:51.770 回答