%macro ck_maxlen(din=, dout=); **** Get all char variables and assigned length ***; proc contents data=&din noprint out=vardata; run; proc sort data=vardata; by name; where type=2; run; proc sql noprint; select name into :varlist separated by " " from vardata ; quit; *** Count variables in varlist ****; %let varcnt=%sysfunc(countw(&varlist)); *** get max length for each variable ****; proc sql noprint; %do i=1 %to &varcnt; %let var&i = %scan(&varlist,&i); select max(lengthn(&&var&i)) into :varlen&i from &din ; %end; quit; data maxlen; length name $32; %do i=1 %to &varcnt; name="&&var&i"; maxlen=&&varlen&i; output; %end; run; **** Compare assigned length with max length ****; proc sort data=maxlen; by name; run; data &dout; merge vardata(in=a keep=memname name length) maxlen(in=b); by name; length reuslt $20; if length=maxlen then result='Same'; else result='Different'; label length='Length Assigned' maxlen='Length of Longest String'; run; %put Output dataset name is &dout.; %mend ck_maxlen; %ck_maxlen(din=msdtmv.dm, dout=dmout);