ठीक है, मुझे लगता है कि यह क्या चल रहा है। पहली समस्या यह है कि आपके मैक्रो इनोकेशन डबल कोट्स में हैं, और इसलिए एसएएस ने डेटा चरण को संसाधित करना शुरू करने से पहले प्री-प्रोसेसर द्वारा संसाधित किया जा रहा है (इस पर ध्यान दिए बिना कि क्या स्थिति सही है या नहीं)। आपको मैक्रो प्री-प्रोसेसर द्वारा समय-समय पर निष्पादित होने से रोकने के लिए डबल कोट्स की बजाय सिंगल कोट्स में निष्पादित करने के लिए तर्क डालना होगा।
यह कोड अभी भी एक खाली डेटासेट पर काम नहीं करेगा, हालांकि, सेट लाइन पर प्रदान किया गया डेटासेट खाली है, तो पूरे डेटा चरण को समाप्त करने से पहले, संपूर्ण डेटा चरण समाप्त हो जाता है।
तीसरा, _N_ को प्रारंभिक 1, 0 नहीं, और डेटा चरण सीमा पर वहां से बढ़ाया गया है, इसलिए _N_ = 0
स्थिति हमेशा गलत होगी।
इस बारे में जा रहा nobs = विकल्प का उपयोग करने के रूप में स्थापित करने के लिए किया जाएगा की एक वैकल्पिक तरीका इस प्रकार है:
data _NULL_;
if 0 then set new nobs=num_obs;
if num_obs = 0 then call execute ('%put empty dataset;');
if num_obs > 0 then call execute ('%put non-empty dataset;');
stop;
run;
if 0 then
एक डमी डेटा कदम कोड के निष्पादन के लिए किया जाता हालत है, यदि एक नंगे सेट स्टेटमेंट का उपयोग किया गया था तो डेटासेट "नया" खाली होने पर निष्पादन सेट लाइन से पहले जारी नहीं रहेगा।
%let dsid = %sysfunc (open(dataset_name));
%let anyobs = %sysfunc (attrn(&dsid,ANY));
%let dsid = %sysfunc (close(&dsid));
मैक्रो चर &anyobs
1 हो सकता है अगर dataset_name कम से कम एक अवलोकन (पंक्ति) और कम से कम एक में शामिल हैं:
एक बेहतर विकल्प मैक्रो का उपयोग डाटासेट को खोलने के लिए और किसी भी विशेषता को पढ़ने के लिए हो सकता है परिवर्तनीय (कॉलम), 0 यदि इसमें कोई अवलोकन नहीं है लेकिन कम से कम एक चर है, और -1 यदि इसमें कोई अवलोकन नहीं है और कोई चर नहीं है।
धन्यवाद गैरी! आपका जवाब वास्तव में सहायक है। –
अच्छा व्यापक जवाब –