初学者,尝试编写可以轻松跨系统移植的SAS代码。
目标: 我想让PROC SQL为多部分表标识符使用全局变量。
/* global variables*/
%LET lib_name="Merge_Contacts"
%LET table_name="Contacts"
/* Simple Query */
PROC SQL;
CREATE TABLE Merged_Contacts AS
SELECT a.*, b.*
/* Below is the problem area */
/* SAS doesn't recognize this as a valid lib/table name */
FROM &lib_name.&table_name
...
/*merge another table*/
QUIT;
我试图以几种方式连接此标识符,但没有成功。有什么想法吗?谢谢!
答案 0 :(得分:1)
/* global variables*/
%LET lib_name=Mrg_ctat; /* lib names 8 characters and you needed ; on
%LET table_name=Contacts; both %let statements Also, remove "" */
/* Simple Query */
PROC SQL;
CREATE TABLE Merged_Contacts AS
SELECT a.*, b.*
/* Below is the problem area */
/* SAS doesn't recognize this as a valid lib/table name */
/* use .. to tag end of first macro variable. This will provide
single . as separator */
FROM &lib_name..&table_name
...
/*merge another table*/
QUIT;
答案 1 :(得分:1)
SAS没有全局变量,但您可以创建全局MACRO变量。 SAS宏处理器是一种生成代码的方法。您不希望包含引号字符。对于宏处理器,所有内容都是字符串,因此无需添加引号来帮助区分字符串和运算符或变量名称。宏触发器(%和&)允许宏处理器在将其转发到SAS语言编译器之前知道某些内容将被考虑用于特殊处理。
您的%LET
语句还需要结束分号以标记语句的结尾。行结束对宏处理器或SAS代码没有特殊意义。
SAS libref也不能超过8个字符。
/* global MACRO variables*/
%LET lib_name=source ;
%LET table_name=Contacts ;
如果您使用的LIBREF尚未定义,那么您可能还需要添加LIBNAME
语句。
libname &lib_name 'physical path' ;
现在你有了两个宏变量,你可以将它们组合起来生成数据集引用。请记住,宏处理器使用句点作为特殊字符来指示宏变量的名称何时结束。因此,要在libref和memname之间包含SAS语言语法所需的实际周期,您需要添加另一个句点。
/* Simple Query */
PROC SQL;
CREATE TABLE Merged_Contacts AS
SELECT a.*, b.*
FROM &lib_name..&table_name
...
/*merge another table*/
QUIT;