Database

Migration SQL Server vers Oracle avec SAS : Contourner la limite des 32 caractères

Simon 23/02/2021 9 views

Lorsqu'on utilise SAS© comme ETL pour copier des tables d'une base de données à une autre (par exemple de SQL Server vers Oracle), on se heurte souvent à une limitation technique irritante : SAS© tronque les noms de variables à 32 caractères.

Les bases de données modernes supportent des noms de colonnes beaucoup plus longs (128 caractères). Une colonne nommée Identity_Source_System_Modified_On dans SQL Server sera tronquée en Identity_Source_System_Modified_ lors de son passage dans SAS©, ce qui peut causer des conflits de noms ou une perte de sens.

Voici deux stratégies pour résoudre ce problème : la méthode moderne (si vous avez les bons outils) et la méthode manuelle (si vous utilisez une version standard de SAS©).

Méthode 1 : La solution "Propre" (PROC FEDSQL)

Si votre environnement SAS© est configuré avec PROC FEDSQL (souvent disponible avec SAS©/ACCESS ou SAS© Viya), c'est la solution idéale.

Contrairement au moteur SAS© classique qui force tout à passer par le format de dataset SAS© (limite de 32 caractères), PROC FEDSQL agit comme un traducteur universel. Il lit les métadonnées de la source et les applique à la cible sans passer par les limitations internes des datasets SAS©.

Le Code

1/* Définition des connexions via LIBNAME */
2LIBNAME sqlsrv sqlserver user=&user pass=&pass ...;
3LIBNAME dest oracle user=&user pass=&pass ...;
4 
5PROC FEDSQL;
6 /* Création directe de la table cible à partir de la source */
7 create TABLE Dest.USR as
8 select * from sqlsrv.User_Table;
9QUIT;

Pourquoi ça marche ? FedSQL est conforme à la norme ANSI SQL. Il mappe les types de données et les noms de colonnes directement du moteur SQL Server vers le moteur Oracle. Si les deux bases supportent des noms de 128 caractères, FedSQL préservera ces noms intégralement.

Prérequis :

  • Vous devez avoir une licence pour PROC FEDSQL.

  • Les moteurs SAS©/ACCESS utilisés doivent supporter cette fonctionnalité.


Méthode 2 : La solution "Système D" (PROC SQL Pass-Through)

Si vous n'avez pas FedSQL ou si l'initialisation échoue, vous devez utiliser SAS© Base. L'astuce repose sur un détail important : si SAS© tronque le nom de la variable, il conserve souvent le nom d'origine complet dans l'étiquette (Label) de la variable lors de l'import ODBC/OLEDB.

La stratégie se déroule en trois temps :

  1. Copier la table (les noms seront tronqués).

  2. Identifier les colonnes tronquées en comparant le nom et l'étiquette.

  3. Générer dynamiquement une commande SQL ALTER TABLE pour renommer les colonnes dans Oracle après coup.

Étape 1 : Copier la table (avec troncature)

1PROC SQL;
2 /* Transfert des données via SAS */
3 /* Les noms > 32 chars sont tronqués ici */
4 create TABLE dest.usr as
5 select * from connection to odbc (select * from dbo.usr);
6QUIT;

Étape 2 : Identifier les noms tronqués

Nous allons lire une ligne de la source dans une table temporaire (WORK.ONE) pour inspecter les métadonnées SAS©.

1PROC SQL;
2 /* Récupérer une seule ligne pour avoir les métadonnées */
3 create TABLE work.one as
4 select * from connection to odbc (select top 1 * from dbo.usr);
5QUIT;

Étape 3 : Générer et exécuter le script de renommage

Nous utilisons la table système DICTIONARY.COLUMNS pour repérer les cas où NAME (tronqué) est différent de LABEL (complet).

1PROC SQL noprint;
2 /* Variable macro pour stocker les commandes ALTER */
3 %let renames=;
4 
5 /* Génération dynamique du script SQL Oracle */
6 /* Syntaxe : ALTER TABLE table RENAME COLUMN old TO new */
7 select 'RENAME COLUMN ' || trim(name) || ' TO ' || trim(label)
8 into :renames separated BY ', '
9 from dictionary.columns
10 where LIBNAME = 'WORK'
11 and memname = 'ONE'
12 and name ne label; /* Condition clé : le nom diffère du label */
13QUIT;
14 
15/* Exécution du renommage directement dans Oracle */
16PROC SQL;
17 connect using dest; /* Utilise la connexion Oracle définie dans le libname DEST */
18 execute (
19 ALTER TABLE USR &renames
20 ) BY dest;
21QUIT;

Note importante sur la syntaxe Oracle :

  • La syntaxe exacte du ALTER TABLE peut varier selon votre version d'Oracle.

  • Assurez-vous que la version de votre base Oracle cible supporte les noms longs (Oracle 12c R2 et plus supportent 128 caractères ; les versions antérieures sont limitées à 30 caractères). Si votre Oracle est ancien (v11g), même cette méthode échouera et vous devrez raccourcir vos noms manuellement.

Résumé

MéthodeAvantagesInconvénients
PROC FEDSQLSimple, robuste, pas de code complexe. Conserve les noms longs nativement.Nécessite une licence spécifique et une configuration compatible.
PROC SQL + ALTERFonctionne avec SAS© Base standard.Plus complexe à coder. Nécessite des droits ALTER sur la base cible. Dépend de la version Oracle.