Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql server 使用SQL Server转换SAS PROC SQL in语句中使用的空格分隔字符串_Sql Server_Sas_Proc Sql - Fatal编程技术网

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编程已经有一段时间了,我忘记了所有奇怪的引用。