Host-Variable aus PROC SQL mit grosser Zahl

SAS zeigt ein problematisches Verhalten, wenn eine sog. Host-Variable (in SAS dann eine Macro-Variable) aus dem PROC SQL erzeugt wird, welche eine grosse Zahl aufnimmt. Dies dürfte in der Praxis äusserst selten vorkommen, doch leider verleitet das DIS zu dieser Art von Programmierung. Generell gilt also noch immer der nette Leitspruch: "Du sollst mit Macrovariablen NICHT grossartige Rechenoperationen durchführen!"

Folgendes Beispiel geht schief:

options nocenter nodate nonumber;

data testchen;
satz_nr=123456781;
run;

proc sql noprint;
select satz_nr into :satz_nr
from work.testchen;
quit;

data versuch;
a=123; b=456; output;
a=&SATZ_NR.; b=a+1; output;
run;

title 'Nicht erfolgreich, da nur acht signifikante Zeichen genommen werden!';
data _null_;
set versuch;
file print;
put a b;
run;

Sobald man explizit im PROC SQL ein FORMAT= verwendet, ist das Problem behoben:

options nocenter nodate nonumber;

data testchen;
satz_nr=123456781;
run;

proc sql noprint;
select satz_nr format=20. into :satz_nr
from work.testchen;
quit;

data versuch;
a=123; b=456; output;
a=&SATZ_NR.; b=a+1; output;
run;

title 'Erfolgreich, wegen Format im SQL!';
data _null_;
set versuch;
file print;
put a b;
run;

SAS-Dokumentation falsch

Hallo Herr Bühler,

vielen Dank für den Hinweis auf die fehlerhafte Umwandlung in SQL.
Bei der Speicherung von Zahlen in Macrovariablen handelt es sich um eine implizite Textkonvertierung. SAS schreibt in der Hilfe: "Values assigned by the INTO clause use the BEST12. format.". Tatsächlich wird aber das BEST8. Format verwendet (Version 9.2). Bei der Function Symput im Datastep wird dagegen wirklich BEST12. verwendet.

Nach meiner Erfahrung ist es besser, implizite Konvertierungen zu vermeiden und explizit mit der PUT-Funktion zu konvertieren. Dadurch werden z. T. schwer auffindbare Fehler vermieden.

Schöne Grüße

Jan

Zustimmung: Implizite Konvertierungen möglichst vermeiden

Hallo Jan,

Hier kann ich nur zustimmen: Implizite Konvertierungen sollten möglichst vermieden werden!

Das BEST12.-Format findet meines Wissens eigentlich überall in SAS bei automatischen Konvertierungen Anwendung (z.B. im normalen Data-Step), wieso PROC SQL INTO hier anders ticket, ist nicht nachvollziehbar. Ich benutzte im übrigen SAS 9.1.3

MfG,

Markus