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 ) );