Migrare da Access a Sql Server 2005

Analizzare e trasferire query

In questo articolo vedremo come poter trasferire ilproprio database da MS Access a SQL Server 2000 utilizzandoun tool che renderà più facile taleoperazione

Scaricare ed installare l' utilityDataFast

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

 

 

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

 

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

Tornando nel menu Tool e da lì inAdd-Ins, vediamo come sia stata aggiunta almenu a tendina una nuova voce: DataFastTools...clickiamoci.

 A questo punto ci viene aperta la finestra relativaall' add-in, la quale ci fornirà diverseopzioni per trasferire qualsiasi database in Access su SQLServer. Andiamo ad analizzarne le funzionalità

 

Analisi delle queries

Dal momento che nei grossi database si trovano spesso tabelleinutilizzate o magari temporanee perchè usate pertest, ed esperimenti, è sempre bene, prima di dare illà al trasferimento, effettuarne una pulitura.Dobbiamo innanzitutto controllare tre parti del nostrodatabase: 1) i metadata della query 2)le queries che al lorointerno integrano altre queries 3)dove le queries sonocollegate a controlli o forms. L' add-in sopra installatoci aiuta a fare tutto ciò; dall' elenco di destradunque selezioniamo la voce Query Analyzer Utility eclickiamo su Go. Ci viene aperta la sotto-riportataschermata:

Come si può facilmente vedere da qui potremoeffettuare proprio i 3 controlli di cui abbiamo parlatosopra.

La prima opzione permetterà all' utente discoprire che tipo di query è quella che si vuoleanalizzare, il che è molto importante ai fini dellaconversione 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 cirestituirà:

La seconda opzione invece raggrupperà ciascuna queryper nome e controllerà se in essa ne ècontenuta un' altra. Per capire, supponiamo di avere unaquery per trovare il sommario degli ordini totali effettuatidai rappresentanti, con associato il resoconto personaledi ciascun venditore. Per far ciò potremmo servirci diuna combinazione di due query, una, chiamataqrySalesRepSummary, che riporta il sommariodelle 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 chemostrerà invece gli ordini effettuati giorno pergiorno da ciascun venditore. La chiameremoqryRepDailyOrderSummary 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 Serverpotremo creare due VIEW, una chiamataqrySalesRepSummary e l' altraqryRepDailyOrderSummary senza dover modificare nullaal loro interno, oppure combinarle in un' unica query, ilche 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 edi controlli nel caso cambiassimo il nome di qualche queryalla quale sono collegati.

 

Scrivere Scripts di StoredProcedure

Un' altra utile funzionalità di DataFast Utilityè quella che permette la conversione dellequeries in Stored Procedure. Questa conversione potrebbeessere tanto benefica quanto dannosa per la query, dalmomento che nei database Access le stored procedure chevengono chiamate vengono eseguite in modalità"sola lettura". Ecco perchè ècosì importante prestare attenzione alle 3 operazionidi analisi sopra-proposte...grazie a loro infatti potremo farchiarezza su quali queries potremmo convertire in storedprocedure (nel caso servano solo per operazioni di lettura dadatabase) e quali invece lasciare intatte, creando magariVIEWS per un form utilizzato per andare a scrivere emodificare records del database.Sotto è riportato un esempio di undatabase sul quale è stata eseguita la conversione dadatabase Access ad SQL Server. Come potremo notarec'è una query di nome qry_frmContacts,che DataFast Utility ha convertito in una stored procedurecon 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 è consigliatomettere una spunta all' opzione[PushToServerCausedError]. Vediamo infine unresoconto di ciò di cui bisogna tener conto ond'evitare errori durante la conversione: SQL Server fa faticaad interpretare DISTINCTROW, ed è quindiconsigliato convertirla in DISTINCT; Date()e Now() vanno sostituite conGETDATE();  infine SQL Server non conosce leistruzioni INSTR(), MID() e IIF(), ma se siconoscono a quali queries sono riferite, le si possonoriscrivere sostituendole rispettivamente con CHARINDEX,SUBSTRING e CASE.

Abbiamo ora tutto il necessario per dare inizio alla nostraconversione e diventare utenti di SQL Server senza doverriscrivere da zero i nostri database.

 



Ti potrebbe interessare anche

commenta la notizia