Πώς μεταφέρουμε CLOB πεδία κειμένου από Oracle Database σε SQL Server χωρίς προβλήματα

Πώς μεταφέρουμε CLOB πεδία κειμένου από Oracle Database σε SQL Server χωρίς προβλήματα
Πώς μεταφέρουμε CLOB πεδία κειμένου από Oracle Database σε SQL Server χωρίς προβλήματα

Αν τύχει κάποια στιγμή και μεταφέρουμε πολλές εγγραφές με πεδία CLOB (μεγάλου κειμένου) από Oracle Database προς SQL Server με κάποιο database link που κάνει χρήση odbc driver υπάρχει μεγάλη πιθανότητα να μεταφέρουμε τα δεδομένα λάθος. Πιο συγκεκριμένα θα δούμε τα πεδία CLOB να μην ταιριάζουν με την σωστή γραμμή που ανήκουν αλλά να ειναι ανακατεμένα μεταξύ των εγγραφών. Σε αυτό το άρθρο θα δούμε μία λύση που λύνει το πρόβλημα.

Η λύση

Η λύση για να παρακάμψουμε αυτό το πρόβλημα είναι κατά την δημιουργία και μεταφορά του πίνακα στον SQL Server να σπάσουμε το CLOB πεδίο σε πολλά πεδία VARCHAR των 4.000 χαρακτήρων αναλόγως του μέγιστου αριθμού χαρακτήρων που έχει το πεδίο. Στο επόμενο βήμα να προσθέσουμε ένα πεδίο τύπου VARCHAR(MAX) το οποίο χωράει έως 65.535 χαρακτήρες με το τελικό όνομα που θέλουμε φέρουμε το CLOB πεδίο. Τέλος να κάνουμε update το νέο πεδίο ενώνοντας όλα τα πεδία VARCHAR2 που το χωρίσαμε στην αρχή.

Ο κώδικας

Με τον παρακάτω κώδικα μεταφέρουμε τον πίνακα χωρίζοντας το CLOB πεδίο σε πεδία VARCHAR 4.000 χαρακτήρων το καθένα:

select * into DBNAME.SCHEMA1.CUSTOMERS from openquery (LNKNAME,'select 
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,1) as VARCHAR2(4000)) as DATA_CLOB,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,4001) as VARCHAR2(4000)) as DATA_CLOB1,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,8001) as VARCHAR2(4000)) as DATA_CLOB2,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,12001) as VARCHAR2(4000)) as DATA_CLOB3,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,16001) as VARCHAR2(4000)) as DATA_CLOB4,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,20001) as VARCHAR2(4000)) as DATA_CLOB5,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,24001) as VARCHAR2(4000)) as DATA_CLOB6,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,28001) as VARCHAR2(4000)) as DATA_CLOB7,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,32001) as VARCHAR2(4000)) as DATA_CLOB8,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,36001) as VARCHAR2(4000)) as DATA_CLOB9,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,40001) as VARCHAR2(4000)) as DATA_CLOB10,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,44001) as VARCHAR2(4000)) as DATA_CLOB11,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,48001) as VARCHAR2(4000)) as DATA_CLOB12,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,52001) as VARCHAR2(4000)) as DATA_CLOB13,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,56001) as VARCHAR2(4000)) as DATA_CLOB14,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,60001) as VARCHAR2(4000)) as DATA_CLOB15,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,64001) as VARCHAR2(4000)) as DATA_CLOB16,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,68001) as VARCHAR2(4000)) as DATA_CLOB17,
CAST(DBMS_LOB.SUBSTR(TEXT, 4000,72001) as VARCHAR2(4000)) as DATA_CLOB18,
, ID, CUSTOMER from SCHEMA1.CUSTOMERS where 1=1');

Με τον παρακάτω κώδικα φτιάχνουμε στον πίνακα που μεταφέραμε το CLOB πεδίο με το όνομα που είχε ως VARCHAR(MAX):

alter table DBNAME.SCHEMA1.CUSTOMERS add TEXT varchar(max);

Τέλος με τον παρακάτω κώδικα ενημερώνουμε το VARCHAR(MAX) πεδίο ενώνοντας τα VARCHAR πεδία που το σπάσαμε κατά την μεταφορά:

UPDATE DBNAME.SCHEMA1.CUSTOMERS
SET TEXT = 
  ISNULL(CAST(DATA_CLOB AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB1 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB2 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB3 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB4 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB5 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB6 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB7 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB8 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB9 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB10 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB11 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB12 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB13 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB14 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB15 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB16 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB17 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB18 AS VARCHAR(MAX)), '') +
    ISNULL(CAST(DATA_CLOB19 AS VARCHAR(MAX)), '');

Φυσικά τώρα αν θέλουμε μπορούμε να διαγράψουμε τις κολώνες που φτιάξαμε για τον προσωρινό κατακερματισμό του CLOB πεδίου.

Μοιράσου το

Αφήστε μία απάντηση