SAS 变量作为 SQL table 名称

SAS variable as SQL table name

编辑:感谢您的快速回复。显然,关于 SaS 我还有很多东西要学习,但每个人的回答都非常有帮助。

这里是初学者,尝试编写可以轻松跨系统移植的 SAS 代码。

目标: 我想让 PROC SQL 使用全局变量作为多部分 table 标识符。

/* 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;            

我曾尝试以多种方式连接此标识符,但都没有成功。有什么想法吗?谢谢!

/* 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;            

SAS没有全局变量,但是可以创建全局MACRO变量。 SAS 宏处理器是一种生成代码的方法。您不想包含引号字符。对于宏处理器来说,一切都是字符串,因此不需要添加引号来帮助它区分字符串和运算符或变量名。宏触发器(% 和 &)允许宏处理器知道某些东西在转发给 SAS 语言编译器之前需要考虑进行特殊处理。

您的 %LET 语句也需要结束分号来标记语句的结尾。行尾对宏处理器或 SAS 代码没有特殊意义。

此外,SAS 库引用不能超过 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;