[英]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.