es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SAS Proc SQL INTO – ¿No se puede escribir una variable macro en una macro?


data COLUMN_LIST_DATA;
length COLUMN_LIST CATEGORY $8.;
input COLUMN_LIST CATEGORY;
datalines;
COL1 MIS_COLUMNAS
COL2 OTRO
COL3 MIS_COLUMNAS
COL4 OTRO
COL5 OTRO
;
run;

%macro TBL_Mantener(var); %macro _; %mend _;

<pre><code>    PROC SQL NOPRINT;
        *Crear declaración SELECT para las columnas que queremos;
        SELECT COLUMN_LIST INTO: &var. SEPARADO POR ' &amp#39;
        FROM COLUMN_LIST_DATA
        WHERE CATEGORY = "&var."
        ;
    QUIT;
</code></pre>

%mend;

%TBL_Mantener(MISCOLUMNAS);
%put &MIS_COLUMNAS.;

No estoy seguro de por qué el código anterior no funciona…. ¿Acaso INTO no acepta variables macro como entrada?
Si escribo el mismo código, sustituyendo manualmente el macroed “&var.” con “MIS_COLUMNAS”, funciona bien.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema en el código tiene que ver con la resolución de variables de macro. La variable de macro &var. no se resuelve adecuadamente dentro de la sentencia SELECT, lo que provoca un error.

    Una forma de resolver este problema es utilizar la función de macro %SYSFUNC() para resolver la variable de macro antes de pasarla a la sentencia SELECT. Aquí hay una versión actualizada del código que debería funcionar:

    %macro TBL_Keep(var);
    %local select_var;
    %let select_var = %sysfunc(quote(&var.));
    
            PROC SQL NOPRINT;
                *Crear sentencia SELECT para las columnas que queremos;
                SELECT COLUMN_LIST INTO: &var. SEPARATED BY ' '
                FROM COLUMN_LIST_DATA
                WHERE CATEGORY = &select_var.;
            QUIT;
    %mend;
    
    %TBL_Keep(MY_COLS);
    %put &MY_COLS.;
    

    En este código actualizado, primero utilizamos %SYSFUNC() para citar el valor de &var. y guardarlo en una nueva variable de macro llamada select_var. Luego utilizamos &select_var. en la cláusula WHERE de la sentencia SELECT para asegurarnos de que la variable de macro se resuelva correctamente.

    Al realizar este cambio, el código debería funcionar como se espera.

Comments are closed.