繁体   English   中英

在SAS中的Proc SQL中使用宏变量

[英]Use macro variables in Proc SQL in SAS

为表架构和表名定义了两个宏变量,它们在SAS(Amazon RedShift的postgresql接口)的proc sql语句中使用,无法正确读取sql语句。

%let table_schema = 'sales';
%let table_name = 'summary_table';

proc sql;
connect to ODBC(DSN='redshift_db', user=masteruser password='*pwd');
create table column_names as
select * from connection to odbc(
select distinct(column_name) as col_name from information_schema.columns where table_schema = &table_schema and table_name = &table_name;
);

create table dt as
select * from connection to odbc(
select * from &table_schema..&table_name;
);

QUIT;

第一次创建表会引发错误:

错误:CLI描述错误:错误:列中的“ summary_table”列不存在;

“ summary_table”实际上存在。

第二个表创建将引发错误:

错误:CLI描述错误:错误:“ sales”或附近的语法错误; 没有使用该句柄执行查询

这也是无效的。

检查您的语法。

查看ERROR: column "summary_table" does not exist in columns;

这就是说,名为“ summary_table”的COLUMN在名为“ columns”的表上不存在。 where子句试图比较2列,而不是列和字符串。

编写不带宏的查询,并使查询生效。 然后尝试放入宏。

这是PostGreSQL ODBC驱动程序而不是SAS的语法问题。

我以前没有使用过PostGreSQL驱动程序,但我知道不同的DB处理引号的方式不同。 可能是PostGreSQL想要双引号而不是单引号。 如果是这种情况,那么我将像这样更改您的代码:

%let table_schema = sales;
%let table_name = summary_table;

proc sql;
connect to ODBC(DSN='redshift_db', user=masteruser password='*pwd');
create table column_names as
select * from connection to odbc(
select distinct(column_name) as col_name from information_schema.columns where table_schema = "&table_schema" and table_name = "&table_name";
);

create table dt as
select * from connection to odbc(
select * from &table_schema..&table_name;
);

QUIT;

请注意,我已经从%let语句中删除了单引号,并在第一个查询中的where子句中添加了双引号。

从宏var中删除单引号也可以解决第二个查询遇到的语法错误,因为您实际上在尝试执行以下操作:

select * from 'sales'.'summary_table';

...这很可能是不正确的。 同样,我没有使用过PostGreSQL,所以我不能肯定地说-如果我写错了,请更正我,这是正确的语法。

最后,我建议在一般情况下使用宏变量时,不要在字符串两边加上单引号。 即。

%let table_schema = 'sales'; * AVOID THIS WHEN POSSIBLE;

VS

%let table_schema = sales;   * USE THIS APPROACH WHEN POSSIBLE;

在使用宏变量的地方加上双引号,您可能会发现事情容易一些。 当然,在某些情况下,您可能需要在宏变量的值中加上引号,但是根据一般经验,我尽可能避免这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM