0

在 SAS 中,我正在使用另一个表中的值更新 MS Access 中的一个表。正在更新的表中的某些字段包含空格。这似乎导致更新语句出现问题。这给了我错误“参数太少。预期为 1。”:

update [Original Table] as a inner join Updates as b on a.ID = b.ID
set a.[Variable 1] = b.[Variable 1]
where Year = "2000";

对于没有空格的字段名称,该语句可以正常工作。而且由于我在其他地方使用字段名称而没有表引用/别名,我认为 [] 和别名的组合导致了问题。有什么建议可以解决这个问题吗?

4

3 回答 3

2

Year()是一个函数,它返回一个变体子类型整数,它对应于您给该函数的日期值的日历年。

在您的情况下,您似乎有一个名为Year. 所以也许“缺少的参数”是Year() 函数的预期日期参数。

Year您可以通过括在方括号中来避免混淆数据库引擎。括号表示引擎Year是对象(字段)名称而不是函数。

update [Original Table] as a inner join Updates as b on a.ID = b.ID
set a.[Variable 1] = b.[Variable 1]
where [Year] = "2000";

只要有可能,最好使用不与保留字冲突的名称。这在您的情况下可能不切实际......但如果您做到,您将减少您将遭受的 Access 开发头痛的数量。:-)

有关“命名挑战”的更多信息,请参阅Access 中的问题名称和保留字

抱歉,尽管存在 WHERE 子句问题,但我忽略了查询可以工作的点。

我看不到任何应该触发数据库引擎投诉的 SQL 的其余部分。我假设您直接在 Access 中测试了该语句,并且没有出错。

如果 SAS 和 Access 之间的交互有什么特殊的原因导致这种情况,也许您可​​以使用保存的 Access 查询作为解决方法。获取该 SQL 并将其保存为命名查询qrySasTest,在您的 Access 数据库中。然后尝试qrySasTest从 SAS 端执行。

于 2012-09-24T20:27:43.063 回答
1

这个查询对我来说是按原样工作的(只修改表名),既可以从 access 运行,也可以从 SAS 运行。这是 SAS 9.3 64 位和 Office 2010 64 位,所以我想你的两个版本可能会有所不同,但它按预期工作。

proc sql; 
connect to access (path="c:\temp\test.accdb"); 
execute 
( 
update [Test2] as a inner join Test as b on a.ID = b.ID
set a.[Variable 1] = b.[Variable 1]
where Year ="2000";
) 
by access; 
disconnect from access; 
quit;
于 2012-09-25T13:59:11.673 回答
1

如果要使用 libname 引用而不是 SAS 访问,可以在 proc sql 语句后使用“dquote=ansi”选项,如下所示。在此示例中,我创建了一个名为 mydbms 的库引用:

libname mydbms odbc dsn=prompt preserve_names=yes;

    proc sql dquote=ansi;
    update mydbms."Original Table" as a inner join mydbms.Updates as b on a.ID = b.ID
    set a."Variable 1" = b."Variable 1"
    where Year = "2000";
    quit;
于 2015-05-23T16:21:43.927 回答