Die Ankunft von SAS© Viya™ und der CAS (Cloud Analytic Services) Engine führte die Verwendung von FedSQL ein, einer standardisierten Implementierung der SQL-Sprache, die für Skalierbarkeit entwickelt wurde. FedSQL ist jedoch viel strenger als das klassische PROC SQL von SAS© Base, insbesondere in Bezug auf Datentypen.
Ein häufiger Fehler tritt beim Filtern von Datumsangaben über numerische Makrovariablen auf.
Das Problem: Starke vs. Schwache Typisierung
Im klassischen SAS© (Base SAS©) ist ein Datum nichts anderes als eine Zahl (die Anzahl der Tage seit dem 1. Januar 1960). Sie können also problemlos schreiben:
WHERE ma_colonne_date > 23040.
In FedSQL sind die Typen streng. Eine als DATE definierte Spalte kann nicht direkt mit einem INTEGER (Ganzzahl) verglichen werden. Wenn Sie versuchen, eine rohe numerische Makrovariable in Ihre CAS-Abfrage einzufügen, erhalten Sie den folgenden Fehler:
ERROR: Operator is not unique: DATE > INTEGER
Dies bedeutet, dass die Engine nicht weiß, wie diese beiden inkompatiblen Datentypen ohne explizite Konvertierung verglichen werden sollen.
Die Lösung: Das ANSI-Format
FedSQL entspricht dem ANSI-SQL-Standard. Um nach einem Datum zu filtern, müssen Sie einen Literalwert in der spezifischen Form angeben:
DATE 'YYYY-MM-DD'
Die technische Herausforderung besteht darin, Ihre numerische Makrovariable (z.B. 23040) in einen formatierten Zeichenfolge (z.B. '2023-01-30') umzuwandeln, während die Einschränkungen der SAS©-Makrosprache (Anführungszeichen, Bindestriche) beachtet werden müssen.
Das technische Rezept
Um diese Zeichenfolge dynamisch zu erstellen, müssen wir drei Tools kombinieren:
PUTN: Um die Rohzahl in ein Datumsformat mit Bindestrichen (yymmddd10.) umzuwandeln.%QSYSFUNC: UmPUTNauszuführen und dabei die Bindestriche (-) zu maskieren. Ohne dasQ(Quoting) könnte SAS© die Bindestriche im Datum (2023**-01-**30) als "Minuszeichen" (Subtraktion) interpretieren.%TSLIT: Ein von SAS© bereitgestelltes Makro, das das Problem der Anführungszeichen löst. In SQL müssen Literale in einfache Anführungszeichen ('Wert') eingeschlossen werden, aber SAS©-Makros können nicht innerhalb einfacher Anführungszeichen aufgelöst werden.%TSLIT(Time Share Literal) generiert eine Zeichenfolge in einfachen Anführungszeichen und ermöglicht gleichzeitig die Auflösung des Makros darin.
Der korrigierte Code
So setzen Sie diese Elemente für eine robuste FedSQL-Abfrage zusammen:
