Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要在proc sql into语句中解析的SAS宏_Sas_Sas Macro - Fatal编程技术网

要在proc sql into语句中解析的SAS宏

要在proc sql into语句中解析的SAS宏,sas,sas-macro,Sas,Sas Macro,谁能帮我解决这里的语法错误。 Y是包含一些值的数据集,比如说1,2,3,4(实际上它包含许多记录) 请有人帮我解释一下错误的原因。你不需要再告诉我有多少错误了。SQL将创建足够的变量 data y; do x = 1 to 4; output; end; run; proc sql; select count(*) into:m from y; select x into:a1- from y; quit; %put &m &

谁能帮我解决这里的语法错误。 Y是包含一些值的数据集,比如说1,2,3,4(实际上它包含许多记录)


请有人帮我解释一下错误的原因。

你不需要再告诉我有多少错误了。SQL将创建足够的变量

data y;
   do x = 1 to 4;
      output;
      end;
   run;
proc sql;
   select count(*) into:m from y;
   select x into:a1- from y;
   quit;
%put &m &a1 &a2 &a3 &a4;

这至少在9.3中有效

你不需要再告诉我有多少了。SQL将创建足够的变量

data y;
   do x = 1 to 4;
      output;
      end;
   run;
proc sql;
   select count(*) into:m from y;
   select x into:a1- from y;
   quit;
%put &m &a1 &a2 &a3 &a4;

这至少在9.3中有效

虽然DN在另一个答案中是正确的,您真的不必再为此费心了,但我认为向您展示尝试中的错误是有用的——这不是一种不合理的方法

您不能像以前那样使用
trim
。这将对字符表达式进行操作,而不是对程序代码进行操作——宏变量正在生成程序代码。您有几个选项可以选择如何执行此操作

首先,有一个问题。这就是你想直接做的事情

proc sql;
select count(*) into :ccount trimmed from sashelp.class;
select name into :a1 - :a%trim(&ccount.) from sashelp.class;
quit;
%put &ccount &a1 &a2 &a3 &a4;
第二,SQL实际上将通过两种可能的选项为您实现这一点

  • trimmed
    关键字
trimmed
关键字作为into子句的一部分,或者使用由分隔的
,即使只有一个结果值,也会导致在目标宏变量中存储修剪结果(因此,左对齐,前后无空格)。(为什么用
分隔的
与不分隔的
的默认值不同,这是SAS中与不破坏有效代码相关的奇怪事情之一,即使这是一个愚蠢的结果。)


虽然DN在另一个答案中是正确的,您真的不必再为此烦恼了,但我认为向您展示尝试中的错误是有用的——这不是一种不合理的方法

您不能像以前那样使用
trim
。这将对字符表达式进行操作,而不是对程序代码进行操作——宏变量正在生成程序代码。您有几个选项可以选择如何执行此操作

首先,有一个问题。这就是你想直接做的事情

proc sql;
select count(*) into :ccount trimmed from sashelp.class;
select name into :a1 - :a%trim(&ccount.) from sashelp.class;
quit;
%put &ccount &a1 &a2 &a3 &a4;
第二,SQL实际上将通过两种可能的选项为您实现这一点

  • trimmed
    关键字
trimmed
关键字作为into子句的一部分,或者使用由
分隔的
,即使只有一个结果值,也会导致在目标宏变量中存储修剪结果(因此,左对齐,前后无空格)。(为什么用
分隔的
与不分隔的
的默认值不同,这是SAS中与不破坏有效代码相关的奇怪事情之一,即使这是一个愚蠢的结果。)


语法错误可能是由于不了解宏处理器的工作方式造成的。它只是一个生成文本的工具。生成的文本必须是有效的SAS代码才能执行。所以试着写一些像:

into :a1 - :a||trim(left(&m.))
这是行不通的。唯一的宏触发器是对M宏变量的引用。因此,这将评估:

into :a1 - :a||trim(left(   4))
但是INTO操作符只需要宏变量名列表的上界名。它无法处理| |串联运算符或调用TRIM()或LEFT()等函数

幸运的是,您不需要这些,因为procsql的INTO子句足够智能,只需生成所需数量的宏变量。如果您使用的是当前版本的SAS,则可以将上限留空

into :a1 - 
或者,如果您运行的是旧版本,则只需使用大于任何预期观察数的上限

into :a1-:a999999
此外,您不需要运行两次查询来确定SQL找到了多少条记录。它将把计数设置到自动宏变量SQLOBS中。因此,您的查询变成:

proc sql noprint;
  select x into :a1- from y;
%let m=&sqlobs;
quit;

语法错误可能是由于不了解宏处理器的工作方式造成的。它只是一个生成文本的工具。生成的文本必须是有效的SAS代码才能执行。所以试着写一些像:

into :a1 - :a||trim(left(&m.))
这是行不通的。唯一的宏触发器是对M宏变量的引用。因此,这将评估:

into :a1 - :a||trim(left(   4))
但是INTO操作符只需要宏变量名列表的上界名。它无法处理| |串联运算符或调用TRIM()或LEFT()等函数

幸运的是,您不需要这些,因为procsql的INTO子句足够智能,只需生成所需数量的宏变量。如果您使用的是当前版本的SAS,则可以将上限留空

into :a1 - 
或者,如果您运行的是旧版本,则只需使用大于任何预期观察数的上限

into :a1-:a999999
此外,您不需要运行两次查询来确定SQL找到了多少条记录。它将把计数设置到自动宏变量SQLOBS中。因此,您的查询变成:

proc sql noprint;
  select x into :a1- from y;
%let m=&sqlobs;
quit;

我可以问一下你们将如何处理宏变量吗?若你们发现这是一个笨拙的转换,将数据从一个有用的结构(SAS数据集)转换到一个不太有用的宏变量“数组”中。请问你们将如何处理宏变量?如果你发现这是一个笨拙的转换,将数据从一个有用的结构(SAS数据集)转换为一个不太有用的宏变量“数组”。我想它是9.3,但我不记得了。这是我在示例中使用的SAS的版本。好的,编辑以包含该版本。如果你找到更早的证据,我们可以加上。我想是9.3,但我不记得了。这是我在示例中使用的SAS的版本。好的,编辑以包含该版本。如果你找到一个早期的证据,我们可以添加它。在@Joe提到的两个选项之上,SQL提供了两种其他方法:1。从y中选择count()到:m1-:m1;不能是“m”,宏变量名称必须是以数字结尾的内容。2.选择count()到:m1-从y开始;这发生在9.3之后。这两种方式与“被分离”一起使用