Sql server 使用SQL Server转换SAS PROC SQL in语句中使用的空格分隔字符串
我有一个宏函数,定义如下:Sql server 使用SQL Server转换SAS PROC SQL in语句中使用的空格分隔字符串,sql-server,sas,proc-sql,Sql Server,Sas,Proc Sql,我有一个宏函数,定义如下: %MACRO Data_Load( Years ); LIBNAME CCDW_LIB ODBC CONNECTION=SHAREDREAD COMPLETE="DRIVER=SQL Server Native Client 11.0;SERVER=&CCDW_Server_Name;Trusted_Connection=Yes;DATABASE=&CCDW_Data
%MACRO Data_Load( Years );
LIBNAME CCDW_LIB
ODBC
CONNECTION=SHAREDREAD
COMPLETE="DRIVER=SQL Server Native Client 11.0;SERVER=&CCDW_Server_Name;Trusted_Connection=Yes;DATABASE=&CCDW_Data_DB;"
SCHEMA="&CCDW_Data_Schema"
PRESERVE_TAB_NAMES=YES
PRESERVE_COL_NAMES=YES
;
/* Server and database details obscured for obvious reasons */
PROC SQL NOPRINT;
CREATE TABLE WORK.TABLE1 AS
SELECT ID
, VAL1
FROM CCDW_LIB.TABLE1
WHERE YR IN ( &Years )
;
QUIT; RUN;
%MEND;
当我将其作为%Data\u Load(2018)
调用时,我得到一个错误,因为YR实际上被定义为一个VARCHAR而不是一个数字。因此,我尝试在WHERE子句(WHERE YR in(%SepList(&Years,nest=Q))
中添加对SepList的调用,但这会导致语法错误,即使MPRINT语句是格式正确的SQL语句。如果我在PROC SQL调用之前将'2018'放入一个宏变量中,然后使用该变量,则SQL语句运行良好。事实上,我添加了以下内容只是为了看看它们是否相同
%LET Years_IN='2018';
%LET Years_IN1=%SepList( &Years, nest=Q );
%Log( "Years_IN = [&Years_IN]");
%IF &Years_IN1=&Years_IN %THEN %DO;
%Log("They Match");
%END;
%ELSE %DO;
%Log("The DONT Match");
%END;
我想使用SepList,因为调用程序可能需要一年以上的时间。你知道我做错了什么吗?我正在X64_10PRO上运行SAS 9.4 TS Level 1M5,如果有必要的话。尝试添加以下自定义函数,
cquote()
。它将空格分隔的列表转换为单独引用的逗号分隔列表。例如,2012 2013 2014
将转换为'2012'、'2013'、'2014'
这是一个保存在自定义函数工具箱中的好函数。您不必使用proc fcmp
,但它会阻止您拥有一个充满%sysfunc()
的大型宏变量
如果您得到一个错误,说明字符串太长,这是9.4M5中的一个错误,并且存在一个错误。您可以安全地忽略该错误
proc fcmp outlib=work.funcs.funcs;
function cquote(str $) $;
length result $32767;
result = cats("'",tranwrd(cats(compbl(str))," ", "','"),"'");
return (result);
endsub;
run;
options cmplib=work.funcs;
%let years = 2012 2013 2014;
%let yearcq = %sysfunc(cquote(&years.));
我假设您使用的是Richard DeVenezia出色的函数样式实用程序宏%seplist: 请注意,当您指定nest=Q时,它会引入一些宏引用 每当MPRINT日志看起来很好,并且出现错误,并且正在进行宏引用时,请尝试显式取消引用。(SAS应该自动取消报价,但并不总是这样) 因此,请尝试:
WHERE YR IN (%unquote(&Years))
还可以将宏定义的最后一行更改为:
%unquote(&emit)
这样它将在返回值之前取消引用该值。什么是%SEPLIST?你对那个宏有定义吗?@Tom,%SEPLIST可能是。这很有魅力。非常感谢你!我知道发生了什么事。我在SAS编程已经有一段时间了,我忘记了所有奇怪的引用。