SAS的DeclareMacros选项提交:无法正确传输?嗨,我正在尝试应用SAS Submit的DeclareMacros选项。它应该允许将变量值传输到SAS作业中的宏。我做了这个小小的剪辑(它会运行,但失败):
a = "test1";
b = "test2";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS Submit("
data test;
x = &a;
y = &b;
run;
",
declaremacros(a,b),GetSASLog(true));
SAS日志说:
768 %let a=%NRBQUOTE(test1);
769 %let b=%NRBQUOTE(test2);
770
771 data test;
772 x = &a;
773 y = &b;
774 run;
NOTE: Variable test1 is uninitialized.
NOTE: Variable test2 is uninitialized.
NOTE: The data set WORK.TEST has 1 observations and 4 variables.
并且数据集测试包含:

我没有看到,我做错了什么。
最好的祝福
PoulRavnSørensen
Re:SAS的DeclareMacros选项提交:无法正确传输?您错误地使用了宏变量。
如果要在数据步骤中的赋值右侧使用它们,则需要引用它们。
a = "test1";
b = "test2";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS Submit("
data test;
x = \!"&a\!";
y = \!"&b\!";
run;
proc print;
run;
",
declaremacros(a,b),GetSASLog(true));
校验使用宏变量欲获得更多信息。
Re:SAS的DeclareMacros选项提交:无法正确传输?嗨,再次,杰夫建议的作品。谢谢。
我仍在使用日期时间变量进行格斗。见代码。问题是:如何为d_num分配datetime变量的值?(后撤一点,但它仍然是相同的代码,只有提交字符串是在SAS Submit语句之前构建的。)
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
Meta Connect( "sas.radiometer.dk", 8561, "", ProfileLookup );
_importsasconn = SAS Connect( "SASApp" );
SAS_sbmt_str =
"data test;
x = \!"&a\!";
y = \!"&b\!";
d = \!"&c\!";
d_num = ???;
run;
proc print; run;";
SAS Submit(SAS_sbmt_str, declaremacros(a,b,c),GetSASLog(true));
最好的问候Poul RS
Re:SAS的DeclareMacros选项提交:无法正确传输?处理SAS宏变量及其解决方案可能会令人困惑,尤其是在引用其中包含引号的宏变量时。有一整套SAS文档宏报价 。
首先我要说的是,我对这个主题了解得足以让你开始并给你一些有用的东西,但还不足以解释所有的细节。你应该开始经常光顾 SAS编程在董事会 SAS支持社区得到更彻底的解释和不足。
最好只找出SAS中你需要的东西,然后弄清楚如何让JSL将其传递给SAS。
这是您尝试做的SAS语法。
%let a = test1;
%let b = test2;
%let c = '15may2019 00:00'dt;
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
请注意,&a和&b需要使用双引号(宏变量仅在双引号中解析),因为您希望将它们的值用作字符串文字,并且它们的值中没有引号。
另一方面,您已将日期时间值作为日期时间常量,并带有单引号和 DT 表明它是一个日期时间常数。由于该宏值已经包含单引号,因此您无需将其放在赋值右侧的引号中。
到目前为止,这么好,但有一个皱纹。为了将JSL变量的值转换为宏变量,JMP使用了 %NRBQUOTE 定义它们的功能。 如果您从SAS提交(...,声明宏(...))查看SAS日志,您将看到:
103 %let a=%NRBQUOTE(test1);
104 %let b=%NRBQUOTE(test2);
105 %let c=%NRBQUOTE('15may2019 00:00'dt);
这是因为JMP不知道您的JSL变量是否包含任何特殊字符( '“()+ - * / <> =¬^〜;,#blank AND OR NOT EQ NE LE LT GE GT IN )需要在SAS中屏蔽。
如果我们在SAS中做同样的事情并提交此代码:
%let a=%NRBQUOTE(test1);
%let b=%NRBQUOTE(test2);
%let c=%NRBQUOTE('15may2019 00:00'dt);
data test;
x = "&a";
y = "&b";
d = &c;
run;
proc print; run;
我们将在SAS日志中看到这一点:
150 %let a=%NRBQUOTE(test1);
151 %let b=%NRBQUOTE(test2);
152 %let c=%NRBQUOTE('15may2019 00:00'dt);
153
154 data test;
155 x = "&a";
156 y = "&b";
157 d = &c;
NOTE: Line generated by the macro variable "C".
157 '15may2019 00:00'dt
_
386
_
76
ERROR 386-185: Expecting an arithmetic expression.
ERROR 76-322: Syntax error, statement will be ignored.
158 run;
NOTE: The SAS System stopped processing this step because of errors.
[这是我理解失败的地方。我可以告诉你什么你需要做的是使用带有蒙版字符的宏变量但不多关于为什么你需要这样做。再次,转到 SAS编程获取更多信息的董事会。]
因此,因为SAS宏变量是由JMP使用%NRBQUOTE函数定义的,并且,因为我们不希望单引号被屏蔽,所以我们需要使用%UNQUOTE函数来获取它们。
所以,在JSL中它看起来像这样:
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
SAS_sbmt_str =
"data test;
x = \!"&a\!";
y = \!"&b\!";
d = %UNQUOTE(&c);
run;
proc print; run;";
SAS Submit( SAS_sbmt_str, declaremacros( a, b, c ), GetSASLog( true ) );
其他人可能想知道在您的探索和使用中您对此问题的了解 SAS支持社区 。因此,发布您认为有用的讨论主题的任何链接。
Re:SAS的DeclareMacros选项提交:无法正确传输?感谢您使用JSL的“Eval Insert”解释并提供替代解决方案。我认为,为了我的目的,使用后一种解决方案就足够了,因为我想要完成的只是将一些用户选择转移到SAS代码。并且,根本不需要DeclareMacros调用。它没有那个工作。
最好的祝福
PoulRavnSørensen
Re:SAS的DeclareMacros选项提交:无法正确传输?我还应该指出,您发布的示例并不真正需要SAS端宏功能的强大功能。相反,使用 Eval Insert() 如果您的实际案例同样简单,那么构建您的SAS_sbmt_str可能会很有用。
a = "test1";
b = "test2";
c = "'15may2019 00:00'dt";
SAS_sbmt_str = Eval Insert( "data test;
x = '^a^';
y = '^b^';
d = ^c^;
run;
proc print; run;" );
SAS Submit( SAS_sbmt_str, GetSASLog( true ) );