访问SQL:在运行时创建字段

时间:2013-09-06 17:59:10

标签: sql vba ms-access access-vba

我正在尝试在我的SQL查询中创建一个“动态”字段

INSERT INTO tblCARS (CreateField("[tblCARS]","[colors]","TEXT")) 
SELECT      avail_colors
FROM        tblSHOPS
WHERE       car_model = model_car;

这应该给我与

相同的结果
INSERT INTO tblCARS (colors) 
SELECT      avail_colors
FROM        tblSHOPS
WHERE       car_model = model_car;

字段[colors]不存在,所以我想在运行查询时将其附加到名为[tblCARS]的现有表中。

函数CreateField()看起来像这样

Public Function CreateField(strTable As String, strField As String, strType As String) As Variant
    CreateField = Null

    If (strField <> vbNullString) And (DoesTblFieldExist(strTable, strField) = False) Then
        CurrentDb.Execute "ALTER TABLE " & strTable & " ADD COLUMN " & strField & " " & strType
    End If

    CreateField = strField
End Function

当我运行查询时,Access会给出错误“语法不正确”(已翻译),并且光标停在第二个括号中。

是否有人成功在Access运行时在Access查询中创建字段? 我知道我可以在VBA上完全做到这一点,但这不是我的目标。

任何提示?

1 个答案:

答案 0 :(得分:3)

该方法尝试让db引擎在执行语句时确定目标字段的名称。不幸的是,Access的db引擎不提供这种功能。

本质上,该语句将CreateField()函数视为参数。并且Access不允许您使用字段名称的参数。

考虑一个简单的参数示例。这个陈述成功了......

INSERT INTO tblFoo(some_text) VALUES ("bar");

但是当提供相同的字段名称( some_text )作为参数时,语句会失败...

PARAMETERS which_field Text ( 255 );
INSERT INTO tblFoo(which_field) VALUES ("bar");

因此,您需要使用2个操作而不是单个查询。您可以执行ALTER TABLE,然后执行修改后的INSERT,并将字段名称硬编码到语句中。