La automatización de tareas analíticas a través de la API REST de SAS© Viya™ es una práctica común para integrar la potencia de SAS© en pipelines externos. Sin embargo, un error frecuente ocurre al usar la acción runCode para manipular tablas ubicadas en bibliotecas CAS (Caslibs) cuyo nombre excede el límite histórico de 8 caracteres.
Este artículo detalla el origen de esta limitación y presenta la sintaxis correcta para solucionar el problema sin tener que renombrar sus bibliotecas.
Cuando envía código Data Step a través de una solicitud HTTP POST al endpoint runCode de CAS, podría verse tentado a usar la sintaxis clásica de dos niveles (Libref.Tabla).
Si el nombre de su biblioteca (Caslib) es largo, por ejemplo mycaslibdatasaviya (que excede ampliamente los 8 caracteres), encontrará el siguiente error si intenta usar una referencia explícita:
¿Por qué este error?
En el entorno clásico de SAS©, las referencias de biblioteca (librefs) están estrictamente limitadas a 8 caracteres. Aunque SAS© Viya™ y CAS admiten nombres de Caslibs mucho más largos, el intérprete de Data Step invocado por runCode conserva algunas restricciones sintácticas heredadas cuando se utiliza la notación Biblioteca.Tabla.
Además, intentar definir un LIBNAME dentro de la llamada runCode (ej: libname myref cas caslib=mycaslibdatasaviya ...) a menudo fallará con un error que indica que la instrucción no es válida o está mal ubicada, ya que LIBNAME es una instrucción global que no se puede ejecutar en el contexto restringido de la acción runCode.
La documentación y los mensajes de error sugieren usar "la opción de conjunto de datos CASLIB=". En la práctica, esto significa que en lugar de prefijar el nombre de la tabla con el nombre de la biblioteca, debe especificar la biblioteca como una opción entre paréntesis justo después del nombre de la tabla.
Este método permite superar por completo el límite de 8 caracteres y funciona para todos los nombres de Caslibs, sin importar su longitud.
Sintaxis incorrecta (causa el error)
En este ejemplo, el uso del punto (.) para separar la biblioteca de la tabla causa el fallo porque mycaslibdatasaviya es demasiado largo para ser interpretado como un libref clásico.
Sintaxis correcta (La solución)
Para corregirlo, elimine el nombre largo del prefijo y colóquelo explícitamente en la opción caslib=.
Así es como se ve el cuerpo JSON final de su solicitud de API con la corrección aplicada. Tenga en cuenta que ya no necesitamos crear referencias temporales.
Resumen
No utilice la notación LongCaslibName.TableName en la acción runCode.
No intente ejecutar una instrucción LIBNAME dentro de un runCode.
Utilice la opción (caslib='NombreDeSuCaslib') directamente después del nombre de la tabla.
Este enfoque es más robusto, estandarizado y le evita los quebraderos de cabeza relacionados con los límites de caracteres heredados.