在Access中生成表时设置字段大小(每列)

时间:2013-02-26 09:22:02

标签: sql vba ms-access ms-access-2007 access-vba

我正在尝试使用VBA脚本将我的数据库导出为.dbf,但dbf要求数据库具有特定的列大小值。

当我离开列中的列时,我收到错误说

field will not fit in record

如何单独设置每列的列大小?最好在生成表时,所以每次生成带有查询的新表时,我都不必手动执行。

我在哪里设置它们? (在Query或SQL中?)

提前致谢!


编辑:

我确保它的字段大小值给我错误。我通过在“设计视图”中打开表来手动更改了所有字段大小值。

所以现在我的问题的第二部分变得更加重要。无论是否可以在生成表格时设置字段大小。


EDIT2:

我目前在查询中使用SQL来创建表,如下所示:

SELECT * INTO DB_Total
FROM Tags_AI_DB;

在初始DB_Total之后,我使用了几个Insert into个查询来添加其他行:

INSERT INTO DB_TOTAL
SELECT a.*
FROM Tags_STS_ENA_DB AS a 
LEFT JOIN DB_TOTAL AS b 
ON a.NAME = b.NAME
WHERE b.NAME IS NULL;

如果我使用DB_Total查询生成Select into表中的列值,那么在使用Insert Into查询插入更多行后,它们是否仍然具有这些值?< / p>


EDIT3:

我决定(在你的一些建议和同事的一些指示之后,最好先制作我的表,然后用查询更新这个表。

然而,似乎我已经遇到了Access的死胡同,这是我正在使用的代码:

CREATE TABLE DB_Total ("NAME" char(79),"TYPE" char(16), "UNIT" char(31), 
"ADDR" char(254), "RAW_ZERO" char(11), "RAW_FULL" char(11), "ENG_ZERO" char(11), 
"ENG_FULL" char(11), "ENG_UNIT" char(8), "FORMAT" char(11), "COMMENT" char(254), 
"EDITCODE" char(8), "LINKED" char(1), "OID" char(10), "REF1" char(11), "REF2" char(11),
"DEADBAND" char(11), "CUSTOM" char(128), "TAGGENLINK" char(32), "CLUSTER" char(16), 
"EQUIP" char(254), "ITEM" char(63), "HISTORIAN" char(6), 
"CUSTOM1" char(254), "CUSTOM2" char(254), "CUSTOM3" char(254), "CUSTOM4" char(254), 
"CUSTOM5" char(254), "CUSTOM6" char(254), "CUSTOM7" char(254), "CUSTOM8" char(254))

这些是我创建DBF文件所需的所有列,我们正在使用它的应用程序接受该文件。

当这产生以下错误时,你会理解我的悲伤:

Record is too large

我可以做些什么来使这个表工作吗?

2 个答案:

答案 0 :(得分:1)

更新

Access 2007的最大记录大小约为2kB(有人无疑会纠正该值) 当您创建CHAR(255)时,无论字段中的内容如何,​​它都将使用255个字节的空间 相比之下,VARCHAR不占用空间(仅足以定义它们),直到你在场中放置东西,它们会动态增长。

CHAR(x)更改为VARCHAR(x),您会将表格的长度缩小到允许的值范围内。请注意,如果您要插入的行大于2kB限制,则可能会遇到麻烦。


生成表时指定列长度的方法是使用CREATE TABLE语句而不是SELECT * INTO

CREATE TABLE DB_Total
(
 Column1Name NVARCHAR(255) --Use whatever datatype and length you need
,Column2Name NUMERIC(18,0) --Use whatever datatype and length you need
,...
) ;

INSERT INTO DB_Total
....

如果使用SELECT * INTO语句,SQL将使用它在现有数据中找到的任何字段长度和类型。

最好在insert语句中列出列名,而不是

INSERT INTO DB_TOTAL
SELECT a.*

你应该把:

INSERT INTO DB_Total
       (
        Column1Name
       ,Column2Name
       ,...
       )
SELECT  a.Column1Name
       ,a.Column2Name
       ,...
FROM   ...
WHERE  ... ;

答案 1 :(得分:1)

Edit2 中,您表示您的流程以“生成表”(SELECT INTO)查询开头,该查询会创建DB_Total并使用Tags_AI_DB中的数据加载它。然后运行一系列“追加”(INSERT)查询以添加其他表中的数据。

现在您的问题是您需要DB_Total的特定字段大小设置,但无法使用“生成表”查询定义这些大小。

我认为您应该创建一次DB_Total并根据需要设置字段大小。如果您愿意,可以使用“设计视图”中的表格手动执行此操作,或执行CREATE TABLE语句。

然后忘记“make table”查询并仅使用“append”查询来添加数据。

如果问题是这是一个重复操作,并且您想在导入新数据之前丢弃以前的数据,请执行DELETE FROM DB_Total而不是DROP TABLE DB_Total。这将允许您保留(现在为空)DB_Total表的结构,因此您无需再次设置字段大小。

在我看来,如果源表的结构发生变化,那么唯一可能存在的潜在问题。如果发生这种情况,请修改DB_Total的结构,使其再次兼容。