Guide SAS VIYA

SAS Viya: Wie man CASLIB-Namen, die länger als 8 Zeichen sind, über die REST-API verwaltet

Simon 26/08/2024 3 views

Die Automatisierung von analytischen Aufgaben über die SAS© Viya REST-API ist eine gängige Praxis, um die Leistungsfähigkeit von SAS© in externe Pipelines zu integrieren. Ein häufiger Fehler tritt jedoch bei der Verwendung der Aktion runCode auf, um Tabellen zu bearbeiten, die sich in CAS-Bibliotheken (Caslibs) befinden, deren Name die historische Grenze von 8 Zeichen überschreitet.

Dieser Artikel erläutert den Ursprung dieser Einschränkung und stellt die korrekte Syntax vor, um das Problem zu umgehen, ohne Ihre Bibliotheken umbenennen zu müssen.

Illustration

Das Problem: Die 8-Zeichen-Grenze

Wenn Sie Data-Step-Code über eine HTTP-POST-Anfrage an den runCode-Endpunkt von CAS senden, könnten Sie versucht sein, die klassische zweistufige Syntax (Libref.Tabelle) zu verwenden.

Wenn Ihr Bibliotheksname (Caslib) lang ist, zum Beispiel mycaslibdatasaviya (was 8 Zeichen bei weitem überschreitet), werden Sie auf den folgenden Fehler stoßen, wenn Sie versuchen, einen expliziten Verweis zu verwenden:

ERROR: Caslib 'mycaslibdatasaviya' exceeds 8 characters. Use the CASLIB= data set option for caslibs longer than 8 characters.

Warum dieser Fehler?

In der klassischen SAS©-Umgebung sind Bibliotheksreferenzen (Librefs) streng auf 8 Zeichen beschränkt. Obwohl SAS© Viya und CAS wesentlich längere Caslib-Namen unterstützen, behält der von runCode aufgerufene Data-Step-Interpreter einige geerbte syntaktische Einschränkungen bei, wenn die Notation Bibliothek.Tabelle verwendet wird.

Darüber hinaus wird der Versuch, eine LIBNAME-Anweisung innerhalb des runCode-Aufrufs zu definieren (z.B. libname myref cas caslib=mycaslibdatasaviya ...), oft mit einem Fehler fehlschlagen, der besagt, dass die Anweisung ungültig oder falsch platziert ist, da LIBNAME eine globale Anweisung ist, die nicht im eingeschränkten Kontext der runCode-Aktion ausgeführt werden kann.

Die Lösung: Die Tabellenoption CASLIB=

Die Dokumentation und Fehlermeldungen schlagen vor, die "CASLIB= data set option" zu verwenden. Konkret bedeutet dies, dass Sie anstatt dem Tabellennamen den Bibliotheksnamen voranzustellen, die Bibliothek als Option in Klammern direkt nach dem Tabellennamen angeben müssen.

Diese Methode ermöglicht es, die 8-Zeichen-Grenze vollständig zu umgehen und funktioniert für alle Caslib-Namen, unabhängig von ihrer Länge.

Falsche Syntax (verursacht den Fehler)

In diesem Beispiel führt die Verwendung des Punktes (.), um die Bibliothek von der Tabelle zu trennen, zum Scheitern, da mycaslibdatasaviya zu lang ist, um als klassisches Libref interpretiert zu werden.

1/* Code qui échoue dans l'appel REST à cause du nom long */
2DATA mycaslibdatasaviya.LAB_RESULTS(append=force);
3 SET mycaslibdatasaviya.data201902;
4RUN;

Korrekte Syntax (Die Lösung)

Um das Problem zu beheben, entfernen Sie den langen Namen aus dem Präfix und setzen Sie ihn explizit in die Option caslib=.

1/* Code qui fonctionne parfaitement avec le nom long */
2DATA LAB_RESULTS(append=force caslib='mycaslibdatasaviya');
3 SET data201902(caslib='mycaslibdatasaviya');
4RUN;

Implementierung im REST-Aufruf

So sieht der endgültige JSON-Body Ihrer API-Anfrage mit der angewendeten Korrektur aus. Beachten Sie, dass wir keine temporären Referenzen mehr erstellen müssen.

New Buffer RO
{
"code": "data LAB_RESULTS_CLASSIFICATION(append=force caslib='mycaslibdatasaviya'); set data201902(caslib='mycaslibdatasaviya'); run;"
}
~
~

Zusammenfassung

  1. Verwenden Sie nicht die Notation LangerCaslibName.TabellenName in der Aktion runCode.

  2. Versuchen Sie nicht, eine LIBNAME-Anweisung innerhalb eines runCode-Blocks auszuführen.

  3. Verwenden Sie die Option (caslib='IhrCaslibName') direkt nach dem Tabellennamen.

Dieser Ansatz ist robuster, standardisierter und erspart Ihnen Kopfzerbrechen im Zusammenhang mit geerbten Zeichenbeschränkungen.