Sas 使用proc sql中的宏和ODBC连接访问数据库

Sas 使用proc sql中的宏和ODBC连接访问数据库,sas,proc-sql,Sas,Proc Sql,我有一个名为fileName的宏变量。我尝试在procsql中使用它,它通过ODBC连接到Access数据库。但是,我的代码要么有错误,要么无法识别宏变量 这是我的密码: %let fileName=MYFILE.NAME proc sql; connect to odbc ("DSN=MS Access Database;"|| "DBQ=&dbname;"|| "FIL=MS Access;" ||

我有一个名为fileName的宏变量。我尝试在procsql中使用它,它通过ODBC连接到Access数据库。但是,我的代码要么有错误,要么无法识别宏变量

这是我的密码:

%let fileName=MYFILE.NAME
proc sql;
connect to odbc ("DSN=MS Access Database;"||
               "DBQ=&dbname;"||
               "FIL=MS Access;" ||
               "MaxBufferSize=512;" ||
               "PageTimeout=600;" ||
               "UID=admin");
create table t1 as
select * from connection to odbc
(SELECT * FROM tableA
where FileName='&fileName');
quit;
这将返回0行。如果在查询中用实数替换宏变量,它将返回1行正确的数据

如果在&fileName周围使用双引号,则会出现以下错误: 错误:CLI描述错误:[Microsoft][ODBC Microsoft Access驱动程序]“”不是有效的名称。确保它不会 包括无效字符或标点符号,且不太长


有人能告诉我如何将宏变量传递给查询吗?谢谢。

如果要解析宏变量,您需要确保它不包含在单引号中。这一行:

where FileName='&fileName');
……需要:

where FileName="&fileName");

外部DBMS不像SAS那样处理单引号和双引号:双引号括住变量名,而单引号括住字符串-您不能使用双引号解析宏并将此结果用作i中的字符串;Ewhere子句。 你应该编码

%设schema=SCOTT; 其中所有者=%unquote(%str(%'&schema%'))


请参见

尝试条带化前导和尾随空间,以防它们是由输入缓冲区创建的

where FileName = "%sysfunc(strip(&fileName))"  );

在宏变量声明之后,在proc sql开始之前,您缺少一个分号。我的原始副本中有它。我在这里复制代码时忘了把它放在这里。如果你有工作代码,在日志中贴一个例子。要解析宏变量,您肯定需要双引号。是否考虑使用libname方法来访问access DB?谢谢Reese。我试着用libnmae。它起作用了。然而,我相信当使用libname时,SAS会在运行查询之前读取整个表。我试图避免这种情况,过去是这样的。SAS现在使用隐式传递,因此查询性能应该非常相似。访问表应该足够小,不会出现问题,如果是服务器,则会出现不同的问题。使用显式传递的一个原因是当表名/列名超过32个字符时。我尝试使用双引号,但得到的错误是:错误:CLI描述错误:[Microsoft][ODBC Microsoft Access驱动程序]“”不是有效的名称。请确保它不包含无效字符或标点符号,并且不太长。这不会删除空格。Strip删除前导空格和尾随空格,但要传递它的第一个和最后一个字符是在宏变量值周围添加的引号,因此根据定义没有前导空格或尾随空格。