SAS阵列创建

SAS阵列创建,sas,sas-macro,proc-sql,Sas,Sas Macro,Proc Sql,我试图创建一个数组来保存一个值 proc sql noprint; select count(*) into :dscnt from study; select libname into :libname1 - :libname&dscnt from study; quit; 我认为语法是正确的,但我在SAS studio中不断收到以下错误消息 ***NOTE: PROC SQL set option NOEXEC and will continue to check the synt

我试图创建一个数组来保存一个值

proc sql noprint;
select count(*) into :dscnt from study;
select libname into :libname1 - :libname&dscnt from study;
quit;
我认为语法是正确的,但我在SAS studio中不断收到以下错误消息

***NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
NOTE: Line generated by the macro variable "DSCNT".
79         libname       4
                      _
                      22
                      200
ERROR 22-322: Syntax error, expecting one of the following: ',', FROM, NOTRIM.  

ERROR 200-322: The symbol is not recognized and will be ignored.***
有人能解释一下我做错了什么吗


谢谢

做下面的事情

 proc sql noprint;
 select count(*) into :dscnt from sashelp.class;
  select name into :name1 - :name%left(&dscnt) from sashelp.class;
  quit;

proc sql
中的
into
语法将格式化值存储到宏变量中。例如,如果运行此代码:

proc sql noprint;
  select count(*) into :dscnt from sashelp.class;
quit;

%put #&dscnt#;
您将看到输出为:

#      19#
换句话说,结果用空格填充。这意味着在您的示例中,代码解析为:

select libname into :libname1 - :libname      19 from study;
^这显然是无效的语法。要解决此问题,只需将
TRIMMED
关键字添加到SQL语句中:

select count(*) into :dscnt TRIMMED from study;

感谢Reeza提供了修剪过的关键字。

您不需要提前知道项目的数量,如果您将其留空,SAS将自动创建正确数量的宏变量

如果要在其他位置使用该数字,可以使用“修剪”选项创建该数字,以删除任何额外的空格。请参见下面的第二个示例

proc sql noprint;
select name into :name1- from sashelp.class;
quit;

%put &name1;
%put &name19.;

proc sql noprint;
select count(distinct name) into :name_count TRIMMED from sashelp.class;
quit;

%put &name_count;
结果:

3068      proc sql noprint;
3069      select name into :name1- from sashelp.class;
3070      quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.01 seconds


3071
3072      %put &name1;
Alfred
3073      %put &name19.;
William
3074
3075      proc sql noprint;
3076      select count(distinct name) into :name_count TRIMMED from
3076! sashelp.class;
3077      quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.01 seconds
      cpu time            0.00 seconds


3078
3079      %put &name_count;
19

TRIMMED+您不需要指定最后一个前缀。@Reeza好提示,您知道删除最后一个前缀是否只适用于某些版本的SAS,或者它已经存在很长时间了吗?我认为它是最近在9.3或9.4中引入的。您不必预先计数,但如果删除了前导空格。请参阅此相关答案,SAS将为您统计第一次查询返回的观察数。如果需要计数,只需保存
&sqlobs
。是的,我试图演示修剪选项,如何首先删除这些额外的空间,这是很好的未来知道。