我想在我的EMP_2
表格中添加一列。新的EMP_PCT
列会将百分比存储为数字,例如20%
为20.0
。
我试图输入这个方法。但它在ALTER TABLE
语句中给出了语法错误。
为什么不起作用?下面是我正在使用的SQL:
ALTER TABLE EMP_2
ADD EMP_PCT NUMBER(4,2);
答案 0 :(得分:2)
访问DDL数据类型名称可能很难理清。 NUMBER
实际上创建了一个双精度浮点字段。但是,如果在NUMBER
之后尝试在括号中包含字段大小,精度或比例,则会出现语法错误。无论您是从ADO还是DAO执行它,以下语句都会创建一个双字段:
ALTER TABLE MyTable ADD COLUMN EMP_PCT NUMBER;
下一个语句将一个十进制数据类型列添加到MyTable
,精度= 4且scale = 2,这意味着它将在小数点左侧保留最多2位数,在右侧保存2位数。 / p>
CurrentProject.Connection.Execute "ALTER TABLE MyTable ADD COLUMN EMP_PCT DECIMAL (4,2);"
我使用CurrentProject.Connection
来执行DDL语句,因为它是一个ADO对象,而Access SQL只允许您使用ADO创建一个十进制字段。如果您尝试从DAO执行该语句,则会触发语法错误,例如CurrentDb.Execute
或Access查询设计器。有关详细信息,请参阅Field type reference - names and values for DDL, DAO, and ADOX。
正如@ErikE解释的那样,Access'十进制类型存在问题,特别是对于您正在使用的Access 2003。考虑您是否可以使用货币类型字段。由于db引擎处理固定小数位数的方式,它避免了十进制错误并提供更快的性能。
答案 1 :(得分:1)
首先,我建议您不要在Access 2003中使用Decimal
数据类型,因为there are bugs with it围绕排序(错误的顺序)和聚合(总和截断小数部分)。在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
)完成。
显然,有a way to get this SQL working但需要更改数据库设置:
默认的Jet 4.0 mdb文件中不支持十进制数据类型。您必须使用SQL Server兼容性语法(ANSI 92)设置在SQL窗口中使用十进制数据类型。
点击菜单,工具>选项。单击“表/查询”选项卡。在SQL Server兼容性语法(ANSI 92)部分中选中“此数据库”复选框。此模式将影响整个数据库,包括带有通配符的查询,因此您可能希望在数据库的副本上尝试此操作。
如果仍然无法正常工作,可以考虑使用此方法(thanks to 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帮助页面:
答案 2 :(得分:0)
答案 3 :(得分:0)
试试这个
ALTER TABLE EMP_2 ADD (EMP_PCT NUMBER (4,2));