2017-08-14 2 views
0

Ich bin noch neu in SAS und DB2. Ich habe eine DB2-Tabelle mit einer Spalte, in der Werte gespeichert sind, die als Zeitstempel codiert sind. Ich versuche, Daten aus einem SAS-Datensatz in meinem Arbeitsverzeichnis in diese Spalte zu laden. Einige dieser Zeitstempel entsprechen jedoch Daten vor 01.01.1582 und können nicht als Datetime-Werte in SAS gespeichert werden. Sie werden stattdessen als Zeichenfolgen gespeichert.Einfügen in DB2 fom SAS-Dataset mit Passthrough SQL

Das bedeutet, wenn ich diese Werte in die DB2 - Tabelle laden möchte, muss ich sie zuerst in Timestamp mit der TIMESTAMP() DB2 - Funktion konvertieren, die, soweit ich weiß, Passthrough - SQL mit einer Ausführungsanweisung benötigt im Gegensatz zur Methode SAS ACCESS libname).

PROC SQL; 
    connect to db2 (user = xxxx database = xxxx password = xxxx); 
    execute (insert into xxxx.xxxx (var) values (TIMESTAMP('0001-01-01-00.00.00.000000'))) by db2; 
    disconnect from db2; 
quit; 

Wie kann ich erreichen, dies für alle Werte in den Quelldaten: Zum Beispiel, um einen einzelnen Wert ich folgendes zu schreiben? Eine Anweisung "select ... from" innerhalb des Befehls "execute" funktioniert nicht, da, soweit ich weiß, ich das SAS-Arbeitsverzeichnis nicht innerhalb der DB2-Verbindung referenzieren kann.

Letztendlich könnte ich ein Makro schreiben, das den obigen PROC-SQL-Block ausführt und es für jede Beobachtung innerhalb eines Datenschritts aufruft, aber ich frage mich, ob es einen einfacheren Weg dafür gibt. Das Ändern der Variablentypen ist keine Option.

Vielen Dank im Voraus.

Antwort

1

Eine gewundene Wege, dass etwa arbeiten würde call execute verwenden:

data _null_; 
set sas_table; 
call execute("PROC SQL; 
       connect to db2 (user = xxxx database = xxxx password = xxxx); 
       execute (
       insert into xxxx.xxxx (var) 
       values (TIMESTAMP('"||strip(dt_string)||"')) 
       ) by db2; 
       disconnect from db2; 
       quit;"); 
run; 

Wo sas_table ist Ihr SAS-Datensatz enthält, die Datetime-Werte als Strings und in einer Variablen dt_string genannt gespeichert.

Hier passiert, dass SAS für jede Beobachtung in einem Datensatz das Argument der Aufrufroutine execute mit dem aktuellen Wert dt_string ausführt.

Eine andere Methode Makros statt Anruf auszuführen unter Verwendung im Wesentlichen die gleiche Sache zu tun:

%macro insert_timestamp; 
    %let refid = %sysfunc(open(sas_table)); 
    %let refrc = %sysfunc(fetch(&refid.)); 
    %do %while(not &refrc.); 
    %let var = %sysfunc(getvarc(&refid.,%sysfunc(varnum(&refid.,dt_string)))); 

    PROC SQL; 
     connect to db2 (user = xxxx database = xxxx password = xxxx); 
     execute (insert into xxxx.xxxx (var) values (TIMESTAMP(%str(%')&var.%str(%')))) by db2; 
    disconnect from db2; 
    quit; 

    %let refrc = %sysfunc(fetch(&refid.)); 
    %end; 
    %let refid = %sysfunc(close(&refid.)); 
%mend; 
%insert_timestamp; 

EDIT: Ich denke, Sie auch die Tabelle laden konnte in DB2 als Service-SAS/ACCESS und dann konvertieren Die Zeichenfolgen werden mit SQL-Pass-Through-Zeitstempel versehen. Etwas wie

libname lib db2 database=xxxx schema=xxxx user=xxxx password=xxxx; 
data lib.temp; 
set sas_table; 
run; 
PROC SQL; 
    connect to db2 (user = xxxx database = xxxx password = xxxx); 
    execute (create table xxxx.xxxx (var TIMESTAMP)) by db2; 
    execute (insert into xxxx.xxxx select TIMESTAMP(dt_string) from xxxx.temp) by db2; 
    execute (drop table xxxx.temp) by db2; 
    disconnect from db2; 
quit; 
+0

Hallo, danke für die schnelle Antwort. Das war auch meine Idee, als ich darüber sprach, den proc sql mit einem Datenschritt aufzurufen. Ich frage mich jedoch: Warum verwenden Sie "" in der TIMESTAMP() -Aufruf? –

+1

Gern geschehen. Ich kann nicht sagen, ob Ihre Frage zu einfachen oder doppelten Anführungszeichen gehört. Wenn Singles, gut, in Ihrem Code ist der Zeitstempel Wert eingeschlossen in einfachen Anführungszeichen, so dass die einfachen Anführungszeichen hier so sind, dass der aufgelöste Wert von 'dt_string' auch in Anführungszeichen in der aufgerufenen Abfrage eingeschlossen ist. Wenn doubles, naja, ich benutze sie nicht im 'timestamp'-Aufruf. Ich schließe den String einfach bis zu diesem Punkt, bevor ich ihn mit dem Wert von 'dt_string' verknüpfe. – user2877959

+0

Es hat vorher nicht funktioniert, weil ich es mit TIMESTAMP (& var) und TIMESTAMP (" & var ") versucht habe Ich habe versucht Ihr TIMESTAMP (% str (% ') & var.% Str (%')). Danke noch einmal dafür! Ich nehme an, das funktioniert, weil das DB2 einfache Anführungszeichen erfordert ... ist das der Fall? Endlich ist es dann sicher zu schließen, dass dies nicht mit einem "einfachen" proc sql getan werden kann? –