另外,你的data步也不对,
首先在宏会在data步执行前被执行,宏是不会随着data步的语句执行的,
其次add是数据集变量,不能直接用在%a中调用的,我前面已经说了,如果非要在%a中使用add,那么应该用call symput把add转成宏变量。
但我认为,你这个问题的解决思路不正确了,这个问题不应该这么解决,建议直接使用data步:
data b;
set c;
if index(add,'ab') > 0 then city=1
else if index(add,'bc') > 0 then city=2;
....
else city =n;
run;