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;
编辑:感谢您的快速回复。显然,关于 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;