SAS变量作为SQL表名

SAS变量作为SQL表名,sql,macros,sas,identifier,multipart,Sql,Macros,Sas,Identifier,Multipart,编辑:感谢您的快速回复。很明显,我有很多关于SaS的知识需要学习,但每个人的回答都非常有帮助 初学者在这里,试图编写SAS代码,可以很容易地跨系统移植 目标: 我想让procsql为多部分表标识符使用一个全局变量 /* global variables*/ %LET lib_name="Merge_Contacts" %LET table_name="Contacts" /* Simple Query */ PROC SQL; CREATE TABLE Merged_Contacts

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

初学者在这里,试图编写SAS代码,可以很容易地跨系统移植

目标: 我想让procsql为多部分表标识符使用一个全局变量

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

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

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

/* 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;            
您的
%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;   

你为什么加引号?由于第一个句点将用于指示宏变量名称的结尾,因此需要将句点加倍,因此需要另一个句点作为libname和成员名称之间的分隔符。另外,LIBNAME不能包含超过8个字符。@Tom,无可否认,来自其他编程语言的人不能理解为没有引号的变量赋值。在赋值时,除了大多数通用语言(Python、C#、Java、VB)和专用语言(R、SQL、XSLT)之外,可能并非所有语言都需要引号,否则编译器假定值本身就是声明的变量或对象!所以你可以理解OP的疏忽(尤其是对SAS来说是新手)。仅仅发布一段代码并不是一个好的答案。如果你还发布一句话来解释问题所在以及你做了什么来解决问题,那么你可能会获得更多的选票。另外。。。为什么要在libname前面加两个
&
。一个
&
就足够了。要么&要么&&就行了。前面的评论解释了什么是错误的,肯定会起作用,但这就像说
x+1-2+1+4
x+4
的一个很好的替代品。没有人想阅读额外的字符或找出它们被包括在其中的原因,或者更糟糕的是,认为它们是它工作所必需的。有时你有一些类似&x&y的东西,为了解决这个问题,你使用&x&y。一开始我发现这非常令人困惑,并且发现每当我看到&var1和&var2以某种方式组合在一起时,我都会使用&&。所以你的例子不太公平(imo)