我正在尝试在我的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上完全做到这一点,但这不是我的目标。
任何提示?
答案 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
,并将字段名称硬编码到语句中。