SAS变量作为SQL表名

时间:2015-10-20 20:36:19

标签: sql macros sas identifier multipart

编辑:感谢您的快速回复。我有很多关于SaS的知识,但每个人的回答都非常有帮助。

初学者,尝试编写可以轻松跨系统移植的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;            

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

2 个答案:

答案 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;