要在proc sql into语句中解析的SAS宏
谁能帮我解决这里的语法错误。 Y是包含一些值的数据集,比如说1,2,3,4(实际上它包含许多记录)要在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 &
请有人帮我解释一下错误的原因。你不需要再告诉我有多少错误了。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之后。这两种方式与“被分离”一起使用