Migrare da Access a Sql Server 2005

Analizzare e trasferire query

In questo articolo vedremo come poter trasferire il proprio database da MS Access a SQL Server 2000 utilizzando un tool che renderà più facile tale operazione

Scaricare ed installare l' utility DataFast

Innanzitutto ci serve l' add-in per Access DataFast Utility, che dovremo andare ad aggiungere in Access. Una volta scaricato l' archivio .zip dobbiamo estrarne il contenuto. A questo punto spostiamoci in Access, clickiamo sul menu Tools, lì spostiamoci su Add-Ins, clickiamo su Add-In Manager e scegliamo Add New.

 

 

Nella finestra che ci viene aperta navighiamo fino alla cartella dove abbiamo estratto il contenuto dell' archivio DataUtility.zip e tra i due files che vi troviamo scegliamo di aprire quello relativo alla versione del nostro MS Access ( Access 200x = DFUtility2K.mda; Access 97 = DFUtility97.mda).

 

A questo punto ci viene aperta una nuova finestrella che ci conferma dell' avvenuta installazione dell' add-in. Clickiamo su Close e continuiamo.

Tornando nel menu Tool e da lì in Add-Ins, vediamo come sia stata aggiunta al menu a tendina una nuova voce: DataFast Tools...clickiamoci.

 A questo punto ci viene aperta la finestra relativa all' add-in, la quale ci fornirà diverse opzioni per trasferire qualsiasi database in Access su SQL Server. Andiamo ad analizzarne le funzionalità

 

Analisi delle queries

Dal momento che nei grossi database si trovano spesso tabelle inutilizzate o magari temporanee perchè usate per test, ed esperimenti, è sempre bene, prima di dare il là al trasferimento, effettuarne una pulitura. Dobbiamo innanzitutto controllare tre parti del nostro database: 1) i metadata della query 2)le queries che al loro interno integrano altre queries 3)dove le queries sono collegate a controlli o forms. L' add-in sopra installato ci aiuta a fare tutto ciò; dall' elenco di destra dunque selezioniamo la voce Query Analyzer Utility e clickiamo su Go. Ci viene aperta la sotto-riportata schermata:

Come si può facilmente vedere da qui potremo effettuare proprio i 3 controlli di cui abbiamo parlato sopra.

La prima opzione permetterà all' utente di scoprire che tipo di query è quella che si vuole analizzare, il che è molto importante ai fini della conversione in SQL. Inoltre controllerà se:

  • contiene qualche istruzione IIF (in caso positivo, questa verrebbe trasformata in una T-SQL)?
  • fa utilizzo di una funzione creata dall' utente?
  • contiene un qualificatore NOT?
  • fa utilizzo della keyword DISTINCT?
  • vengono utilizzate le funzioni Date()/Now()? (se sì, le converte in GETDATE())
  • è collegata ad una ComboBox o ad una ListBox?
  • é una query di tipo UNION?
  • Ignora la colonna Count

 Ecco la schermata che l' add-in ci restituirà:

La seconda opzione invece raggrupperà ciascuna query per nome e controllerà se in essa ne è contenuta un' altra. Per capire, supponiamo di avere una query per trovare il sommario degli ordini totali effettuati dai rappresentanti, con associato il resoconto personale di ciascun venditore. Per far ciò potremmo servirci di una combinazione di due query, una, chiamata qrySalesRepSummary, che riporta il sommario delle vendite dei rappresentanti:

    SELECT RepID, RepName, Count(AssignedState) As StateCount
    FROM tblSalesRep INNER JOIN tblAssignedState
    ON   tblAssignedState.RepID = tblSalesRep.RepID
    GROUP BY tblSalesRep.RepID, tblSalesRep.RepName
    ORDER BY tblSalesRep.RepName ASC

Dovremo ora collegare questa query con una che mostrerà invece gli ordini effettuati giorno per giorno da ciascun venditore. La chiameremo qryRepDailyOrderSummary e sarà la seguente:

    SELECT OrderDate, RepName, StateCount, Count(OrderID) As OrderCount
    FROM tblOrder INNER JOIN qrySalesRepSummary 
    ON   qrySalesRepSummary.RepID = tblOrder.RepID
    GROUP BY OrderDate, RepName, StateCount
    ORDER BY RepName, OrderDate

Per trasportare questa combinazione nell' SQL Server potremo creare due VIEW, una chiamata qrySalesRepSummary e l' altra qryRepDailyOrderSummary senza dover modificare nulla al loro interno, oppure combinarle in un' unica query, il che risulterebbe più preciso ed ordinato. Ecco come:

    SELECT OrderDate, RepName, StateCount, Count(OrderID) As OrderCount
    FROM tblOrder INNER JOIN 
       (
        SELECT RepID, RepName, Count(AssignedState) As StateCount
        FROM tblSalesRep INNER JOIN tblAssignedState
        ON   tblAssignedState.RepID = tblSalesRep.RepID
        GROUP BY tblSalesRep.RepID, tblSalesRep.RepName 
       ) AS qrySalesRepSummary
    ON   qrySalesRepSummary.RepID = tblOrder.RepID
    GROUP BY OrderDate, RepName, StateCount
    ORDER BY RepName, OrderDate

L' ultima opzione infine controlla se una o più queries sono collegate a particolari controlli o forms. Questo genere di controllo ci aiuta ad aggiornare le forms ed i controlli nel caso cambiassimo il nome di qualche query alla quale sono collegati.

 

Scrivere Scripts di Stored Procedure

Un' altra utile funzionalità di DataFast Utility è quella che permette la conversione delle queries in Stored Procedure. Questa conversione potrebbe essere tanto benefica quanto dannosa per la query, dal momento che nei database Access le stored procedure che vengono chiamate vengono eseguite in modalità "sola lettura". Ecco perchè è così importante prestare attenzione alle 3 operazioni di analisi sopra-proposte...grazie a loro infatti potremo far chiarezza su quali queries potremmo convertire in stored procedure (nel caso servano solo per operazioni di lettura da database) e quali invece lasciare intatte, creando magari VIEWS per un form utilizzato per andare a scrivere e modificare records del database. Sotto è riportato un esempio di un database sul quale è stata eseguita la conversione da database Access ad SQL Server. Come potremo notare c'è una query di nome qry_frmContacts, che DataFast Utility ha convertito in una stored procedure con il prefisso usp_.

    CREATE PROCEDURE usp_qry_frmContacts

    AS
    SET NOCOUNT ON

    SELECT
        Contacts.*
      , Organizations.OrganizationName
    FROM
       Contacts 
    LEFT JOIN
       Organizations 
    ON
       Contacts.OrganizationID = Organizations.OrganizationID
    WHERE
       (((Contacts.ContactTypeID)<>3 
    OR
       (Contacts.ContactTypeID) Is Null))
    ORDER BY
       Contacts.DisplayName;

Per le queries più complesse è consigliato mettere una spunta all' opzione [PushToServerCausedError]. Vediamo infine un resoconto di ciò di cui bisogna tener conto ond' evitare errori durante la conversione: SQL Server fa fatica ad interpretare DISTINCTROW, ed è quindi consigliato convertirla in DISTINCT; Date() e Now() vanno sostituite con GETDATE();  infine SQL Server non conosce le istruzioni INSTR(), MID() e IIF(), ma se si conoscono a quali queries sono riferite, le si possono riscrivere sostituendole rispettivamente con CHARINDEX, SUBSTRING e CASE.

Abbiamo ora tutto il necessario per dare inizio alla nostra conversione e diventare utenti di SQL Server senza dover riscrivere da zero i nostri database.

 



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Redazione
Condividi le tue opinioni su questo articolo!