从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";
对于没有空格的字段名称,该语句可以正常工作。由于我在其他地方使用字段名称没有表引用/别名,我认为[]和别名的组合导致了问题。有什么建议可以解决这个问题吗?
答案 0 :(得分: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开发难题的数量。 : - )
有关“命名挑战”的更多信息,请参阅Problem names and reserved words in Access。
抱歉,我忽略了尽管存在WHERE子句问题但查询可以正常工作的观点。
我看不到有关SQL的其余内容的任何内容,它应该触发数据库引擎的投诉。我假设您直接在Access中测试了该语句,并且没有错误。
如果SAS和Access之间的交互有一些特殊的东西导致这种情况,也许您可以使用已保存的Access查询作为解决方法。获取该SQL并将其另存为Access数据库中的命名查询qrySasTest
。然后尝试从SAS端执行qrySasTest
。
答案 1 :(得分:1)
此查询对我起作用(仅修改表名),两者都从访问运行并从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;
答案 2 :(得分:1)
如果要使用libname引用而不是SAS访问,可以使用" dquote = ansi" proc sql语句后的选项如下所示。在这个例子中,我创建了一个名为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;