<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic How to pass list of dataset names into a macro as a loop in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897598#M354706</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have a below code but I have around 100 input datasets as a macro variable &amp;amp;dslist. I would like pass all these dataset into below macro called data_comp as a loop. How can I do it?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data _o;
	set sashelp.vtable;
	where libname = upcase("OLD");
	keep memname;
run;
proc sort; by memname; run;

data _n;
	set sashelp.vtable;
	where libname = upcase("NEW");
	keep memname;
run;
proc sort; by memname;run;

data both onlyold onlynew;
	merge _o(in=a) _n(in=b);
	by memname;
	if a and b then output both;
	if a and not b then output onlyold;
	if b and not a then output onlynew;
run;

data both;
	set both onlynew;
run;

Proc SQL NoPrint;	
	Select Distinct(memname) into :dslist Separated by "|" From Both;
	Select Distinct(memname) into :onlynew Separated by "|" From OnlyNew;
Quit;

%put &amp;amp;dslist.;

%let varsdrop=StudySiteId siteid site sitenumber folderid StudyEnvSiteNumber RecordDate MinCreated MaxUpdated SaveTS;
%macro data_comp(inds=, sort=);
proc sort data=old.&amp;amp;inds.(encoding=any) 
out=old1(drop=&amp;amp;varsdrop.); 
by _all_; 
run;

proc sort data=new.&amp;amp;inds.(encoding=any)
out=new1(drop=&amp;amp;varsdrop.); 
by _all_; 
run;

proc sort data=old1; by &amp;amp;sort.; run;
proc sort data=new1; by &amp;amp;sort.; run;

data both_new;
	merge new1(in=a) old1(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and b;
run;

data only_new;
	length flag $50.;
	merge new1(in=a) old1(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and not b;
	flag="New";
run;

proc compare b=old1 c=both_new out=check1 outnoequal outbase outcomp outdif;
run;

data check;
	set check1;
	where _type_="COMPARE";
run;

data updated_new;
	length flag $50.;
	merge both_new(in=a) check(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and b then flag="Updated";
run;

data nlib.&amp;amp;inds.;
	set only_new updated_new;
run;
proc sort; by &amp;amp;sort.; run;
%mend;

%data_comp(inds=ae, sort=recordid);&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Adithya&lt;/P&gt;</description>
    <pubDate>Fri, 06 Oct 2023 16:03:03 GMT</pubDate>
    <dc:creator>chinna0369</dc:creator>
    <dc:date>2023-10-06T16:03:03Z</dc:date>
    <item>
      <title>How to pass list of dataset names into a macro as a loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897598#M354706</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have a below code but I have around 100 input datasets as a macro variable &amp;amp;dslist. I would like pass all these dataset into below macro called data_comp as a loop. How can I do it?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data _o;
	set sashelp.vtable;
	where libname = upcase("OLD");
	keep memname;
run;
proc sort; by memname; run;

data _n;
	set sashelp.vtable;
	where libname = upcase("NEW");
	keep memname;
run;
proc sort; by memname;run;

data both onlyold onlynew;
	merge _o(in=a) _n(in=b);
	by memname;
	if a and b then output both;
	if a and not b then output onlyold;
	if b and not a then output onlynew;
run;

data both;
	set both onlynew;
run;

Proc SQL NoPrint;	
	Select Distinct(memname) into :dslist Separated by "|" From Both;
	Select Distinct(memname) into :onlynew Separated by "|" From OnlyNew;
Quit;

%put &amp;amp;dslist.;

%let varsdrop=StudySiteId siteid site sitenumber folderid StudyEnvSiteNumber RecordDate MinCreated MaxUpdated SaveTS;
%macro data_comp(inds=, sort=);
proc sort data=old.&amp;amp;inds.(encoding=any) 
out=old1(drop=&amp;amp;varsdrop.); 
by _all_; 
run;

proc sort data=new.&amp;amp;inds.(encoding=any)
out=new1(drop=&amp;amp;varsdrop.); 
by _all_; 
run;

proc sort data=old1; by &amp;amp;sort.; run;
proc sort data=new1; by &amp;amp;sort.; run;

data both_new;
	merge new1(in=a) old1(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and b;
run;

data only_new;
	length flag $50.;
	merge new1(in=a) old1(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and not b;
	flag="New";
run;

proc compare b=old1 c=both_new out=check1 outnoequal outbase outcomp outdif;
run;

data check;
	set check1;
	where _type_="COMPARE";
run;

data updated_new;
	length flag $50.;
	merge both_new(in=a) check(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and b then flag="Updated";
run;

data nlib.&amp;amp;inds.;
	set only_new updated_new;
run;
proc sort; by &amp;amp;sort.; run;
%mend;

%data_comp(inds=ae, sort=recordid);&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Adithya&lt;/P&gt;</description>
      <pubDate>Fri, 06 Oct 2023 16:03:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897598#M354706</guid>
      <dc:creator>chinna0369</dc:creator>
      <dc:date>2023-10-06T16:03:03Z</dc:date>
    </item>
    <item>
      <title>Re: How to pass list of dataset names into a macro as a loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897600#M354707</link>
      <description>&lt;P&gt;The way I always do that is like this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;PROC SQL;
SELECT
  memname
    INTO :dslist SEPARATED BY "|"
FROM
  dictionary.tables
WHERE
  UPCASE(libname) = "&amp;lt;YOUR LIBRARY HERE&amp;gt;"
  /* NOTE: if your datasets follow a pattern, use the CONTAINS or LIKE operator instead of = */
  AND UPCASE(memname) = "&amp;lt;YOUR DATASET HERE&amp;gt;"
;
QUIT;

/* Then your macro */

%MACRO test ();
%DO i = 1 %TO %SYSFUNC(COUNTW(&amp;amp;dslist., %STR(|)));
%LET ds = %SCAN(&amp;amp;dslist., &amp;amp;i., %STR(|));

/* USE local macro variable &amp;amp;ds. from here on out */
PROC SORT DATA = &amp;amp;ds. OUT = want;
  BY id;
RUN;

%END;

%MEND test;

%test;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Not tested. Let us know if that gets you anywhere.&lt;/P&gt;</description>
      <pubDate>Fri, 06 Oct 2023 16:11:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897600#M354707</guid>
      <dc:creator>maguiremq</dc:creator>
      <dc:date>2023-10-06T16:11:50Z</dc:date>
    </item>
    <item>
      <title>Re: How to pass list of dataset names into a macro as a loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897603#M354709</link>
      <description>&lt;P&gt;Thanks for your reply&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/281770"&gt;@maguiremq&lt;/a&gt;&amp;nbsp;, I am using below code and it is not working. Am I missing anything?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data _o;
	set sashelp.vtable;
	where libname = upcase("OLD");
	keep memname;
run;
proc sort; by memname; run;

data _n;
	set sashelp.vtable;
	where libname = upcase("NEW");
	keep memname;
run;
proc sort; by memname;run;

data both onlyold onlynew;
	merge _o(in=a) _n(in=b);
	by memname;
	if a and b then output both;
	if a and not b then output onlyold;
	if b and not a then output onlynew;
run;

data both;
	set both onlynew;
run;

Proc SQL NoPrint;	
	Select Distinct(memname) into :dslist Separated by "|" From Both;
	Select Distinct(memname) into :onlynew Separated by "|" From OnlyNew;
Quit;

%put &amp;amp;dslist.;

%MACRO test;
%DO i = 1 %TO %SYSFUNC(COUNTW(&amp;amp;dslist., %STR(|)));
%LET inds = %SCAN(&amp;amp;dslist., &amp;amp;i., %STR(|));

%let varsdrop=StudySiteId siteid site sitenumber folderid StudyEnvSiteNumber RecordDate MinCreated MaxUpdated SaveTS;
%macro data_comp(inds=, sort=);
proc sort data=old.&amp;amp;inds.(encoding=any) 
out=old1(drop=&amp;amp;varsdrop.); 
by _all_; 
run;

proc sort data=new.&amp;amp;inds.(encoding=any)
out=new1(drop=&amp;amp;varsdrop.); 
by _all_; 
run;

proc sort data=old1; by &amp;amp;sort.; run;
proc sort data=new1; by &amp;amp;sort.; run;

data both_new;
	merge new1(in=a) old1(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and b;
run;

data only_new;
	length flag $50.;
	merge new1(in=a) old1(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and not b;
	flag="New";
run;

proc compare b=old1 c=both_new out=check1 outnoequal outbase outcomp outdif;
run;

data check;
	set check1;
	where _type_="COMPARE";
run;

data updated_new;
	length flag $50.;
	merge both_new(in=a) check(in=b keep=&amp;amp;sort.);
	by &amp;amp;sort.;
	if a and b then flag="Updated";
run;

data nlib.&amp;amp;inds.;
	set only_new updated_new;
run;
proc sort; by &amp;amp;sort.; run;
%mend;

%END;

%MEND;

%test;

&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Adithya&lt;/P&gt;</description>
      <pubDate>Fri, 06 Oct 2023 16:33:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897603#M354709</guid>
      <dc:creator>chinna0369</dc:creator>
      <dc:date>2023-10-06T16:33:20Z</dc:date>
    </item>
    <item>
      <title>Re: How to pass list of dataset names into a macro as a loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897612#M354717</link>
      <description>&lt;P&gt;&lt;STRONG&gt;NEVER&lt;/STRONG&gt; say "not working" without supplying any details. Show the log, describe where the results do not meet your expectations, but never just say "it doesn't work". Such a statement immediately qualifies you as an idiot, which I positively hope you're not.&lt;/P&gt;</description>
      <pubDate>Fri, 06 Oct 2023 17:08:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-pass-list-of-dataset-names-into-a-macro-as-a-loop/m-p/897612#M354717</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2023-10-06T17:08:21Z</dc:date>
    </item>
  </channel>
</rss>

