L'arrivée de SAS© Viya™ et du moteur CAS (Cloud Analytic Services) a introduit l'utilisation de FedSQL, une implémentation normalisée du langage SQL conçue pour l'évolutivité. Cependant, FedSQL est beaucoup plus strict que le PROC SQL classique de SAS© Base, notamment en ce qui concerne les types de données.
Une erreur fréquente survient lors du filtrage de dates via des variables macro numériques.
Le Problème : Typage Fort vs Typage Faible
Dans SAS© classique (Base SAS©), une date n'est rien d'autre qu'un nombre (le nombre de jours depuis le 1er janvier 1960). Vous pouvez donc écrire sans problème :
WHERE ma_colonne_date > 23040.
En FedSQL, les types sont stricts. Une colonne définie comme DATE ne peut pas être comparée directement à un INTEGER (entier). Si vous tentez d'injecter une macro-variable numérique brute dans votre requête CAS, vous obtiendrez l'erreur suivante :
ERROR: Operator is not unique: DATE > INTEGER
Cela signifie que le moteur ne sait pas comment comparer ces deux types de données incompatibles sans conversion explicite.
La Solution : Le Format ANSI
FedSQL respecte la norme ANSI SQL. Pour filtrer sur une date, vous devez fournir une valeur littérale sous la forme spécifique :
DATE 'YYYY-MM-DD'
Le défi technique est de transformer votre macro-variable numérique (ex: 23040) en une chaîne de caractères formatée (ex: '2023-01-30'), tout en gérant les contraintes du macro-langage SAS© (cotes, tirets).
La Recette Technique
Pour construire cette chaîne dynamiquement, nous devons combiner trois outils :
PUTN: Pour convertir le nombre brut en format date avec tirets (yymmddd10.).%QSYSFUNC: Pour exécuterPUTNtout en masquant les tirets (-). Sans leQ(Quoting), SAS© pourrait interpréter les tirets de la date (2023**-01-**30) comme des signes "moins" (soustraction).%TSLIT: Une macro fournie par SAS© qui résout le problème des cotes. En SQL, les littéraux doivent être entre simples cotes ('valeur'), mais les macros SAS© ne se résolvent pas à l'intérieur de simples cotes.%TSLIT(Time Share Literal) génère une chaîne entre simples cotes tout en permettant la résolution de la macro à l'intérieur.
Le Code Corrigé
Voici comment assembler ces éléments pour une requête FedSQL robuste :
