2016-11-17 6 views
0

У меня есть макрос, где я в настоящее время передаю 6 имен таблиц и 6 столбцов. Однако количество столбцов и таблиц не всегда будет постоянным.Переменное количество параметров в макросе в SAS?

Есть ли способ иметь переменное количество параметров? Я знаком с концепцией в python с ** kwargs.

Кроме того, есть ли способ параметризовать оператор proc sql, чтобы принимать только столько столбцов и столбцов, сколько предусмотрено? Или попытайтесь поймать какой-либо тип в SAS, чтобы проверить, существуют ли переменные до запуска SQL-запроса?

Вот мой макрос, который я пытаюсь параметризовать.

%macro Generate_TP_tbl(new_tbl_name, trans_col, tbl_1, tbl_2, tbl_3, tbl_4, 
        tbl_5, tbl_6, col_1, col_2, col_3, col_4, col_5, col_6); 

proc sql; 

CREATE TABLE &new_tbl_name AS 

SELECT a1._NAME_, a1.&trans_col as &col_1, a2.&trans_col as &col_2, 
     a3.&trans_col as &col_3, a4.&trans_col as &col_4, a5.&trans_col as &col_5, 
     a6.&trans_col as &col_6 

FROM &tbl_1 as a1, &tbl_2 as a2, &tbl_3 as a3, &tbl_4 as a4, &tbl_5 as a5, 
    &tbl_6 as a6 

WHERE a1._NAME_ = a2._NAME_ = a3._NAME_ = a4._NAME_ = a5._NAME_ = a6._NAME_; 

run; 

%mend Generate_TP_table; 
+0

Используйте пробелы вместо запятых в своих списках. Тогда вам нужно только один или два параметра. – Tom

ответ

2

Передайте их в виде одного параметра и проанализируйте их позже.

%macro (parameters = , table_list = tb1 tb2 tb3 ... tb6, col_list=col1 col2 ... col6, other_parms= ...); 

Я бы рекомендовал построить остальную часть вашего кода, используя цикл do с количеством параметров. Документация здесь есть несколько плохой пример того, как извлечь каждый элемент списка:

http://support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/default/viewer.htm#p1n2i0ewaj1zian1ria5579z1zjh.htm

SQL некрасиво ... Интересно, если шаг данных будет проще, так как вы сливаясь на единственная переменная? Затем он действительно становится переименованием из каждой таблицы, как в приведенном выше примере во многих отношениях.

3

Еще более общий способ сделать это заключается в следующем:

Вы можете затем вызвать %mymacro с любыми параметрами, которые вы любите и анализировать их все из автоматического макропеременной &SYSPBUFF.

Это, вероятно, потребует больше работы, чем решение Ризе, но я подумал, что все равно отправлю это для полноты, поскольку это иногда полезно.

+0

Я бы сказал, что это правильный ответ на вопрос, поставленный в названии, а Реэза - это ответ, который я бы использовал для этого вопроса, как заданного в самом вопросе. – Joe

Смежные вопросы