我想在我的EMP_2
表中添加一列。新列将百分比存储为EMP_PCT
数字,例如.20%
20.0
我试着输入这个方法。但它在ALTER TABLE
语句中给出了语法错误。
为什么它不起作用?下面是我正在使用的 SQL:
ALTER TABLE EMP_2
ADD EMP_PCT NUMBER(4,2);
我想在我的EMP_2
表中添加一列。新列将百分比存储为EMP_PCT
数字,例如.20%
20.0
我试着输入这个方法。但它在ALTER TABLE
语句中给出了语法错误。
为什么它不起作用?下面是我正在使用的 SQL:
ALTER TABLE EMP_2
ADD EMP_PCT NUMBER(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 引擎处理固定小数位数的方式,它避免了小数错误并提供更快的性能。
首先,我建议您不要使用Decimal
Access 2003 中的数据类型,因为它在排序(错误的顺序)和聚合(截断小数部分的总和)方面存在错误。在 Access 2007 中,聚合问题得到了解决,但排序问题没有解决(尽管您可以在 Access 2007 中通过在列上放置索引来解决此问题)。
至于你的脚本,有两个明显的问题:
你必须ADD COLUMN ColumnName
不使用ADD ColumnName
正确的数据类型是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 帮助页面:
尝试这个
ALTER TABLE EMP_2 ADD (EMP_PCT NUMBER (4,2));