Được rồi, đây là những gì tôi nghĩ đang diễn ra. Vấn đề đầu tiên là các lời gọi macro của bạn nằm trong các dấu ngoặc kép và do đó được xử lý trước bộ xử lý trước khi SAS bắt đầu xử lý bước dữ liệu (thực thi bất kể điều kiện if có đúng hay không). Bạn cần đặt đối số để thực hiện trong các dấu nháy đơn chứ không phải dấu ngoặc kép để giữ cho nó không được thực hiện sớm bởi trình xử lý trước macro.
Mã này vẫn không hoạt động trên tập dữ liệu trống, tuy nhiên, nếu tập dữ liệu được cung cấp trên dòng thiết bị trống thì toàn bộ bước dữ liệu sẽ kết thúc trước khi thực thi thêm bất kỳ mã nào.
Thứ ba, _N_ được khởi tạo 1, không phải 0 và tăng dần từ đó trên ranh giới bước dữ liệu, do đó, điều kiện _N_ = 0
sẽ luôn là sai.
Một cách khác để đi về việc này sẽ được sử dụng Nobs = tùy chọn để thiết lập như sau:
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;
Các if 0 then
là một điều kiện giả sử dụng để cưỡng chế thi hành của mã bước dữ liệu; nếu một tuyên bố thiết lập trần đã được sử dụng sau đó thực hiện sẽ không tiếp tục quá dòng thiết lập nếu tập dữ liệu "mới" là sản phẩm nào.
Một lựa chọn tốt hơn có thể được sử dụng macro để mở các tập dữ liệu và đọc bất kỳ thuộc tính:
%let dsid = %sysfunc (open(dataset_name));
%let anyobs = %sysfunc (attrn(&dsid,ANY));
%let dsid = %sysfunc (close(&dsid));
Biến vĩ mô &anyobs
sẽ là 1 nếu dataset_name chứa ít nhất một quan sát (hàng) và ít nhất một biến (cột), 0 nếu nó không chứa các quan sát nhưng có ít nhất một biến và -1 nếu nó không chứa các quan sát và không có biến nào.
Cảm ơn Gary! Câu trả lời của bạn thực sự hữu ích. –
Câu trả lời toàn diện hay –