Martedì stavo lavorando con il nuovo SQL Server 2005 e
ho riscontrato questo problema che voglio documentare sul blog perchè magari
potrà essere di aiuto a qualcuno.
Lo scenario è questo. Immaginate di avere un database Access (prova.mdb) con una sola tabella (Input) con un solo campo (DataServizio) di tipo Data/Ora. Popolate la tabella a mano
con un po' di valori a caso, ottenendo ad esempio:
Ok, fin qua nulla di particolarmente complicato. Sperando che non siate
inorriditi dalo screenshot di Access 2003 qui sopra, vado avanti con il mio
discorso. Adesso immaginiamo di dover creare un database
SQL Server 2005 analogo (TestDB), cioè con una sola
tabella (Output) ed un solo campo (DataServizio). Dopo questo, vorrei creare un Integration
Services Project con Visual Studio 2005 per trasferire tutti i records dalla
tabella di Access a quella di SQL Server.
Ovviamente, quello che sto dicendo
è semplificato ed estrapolato da un caso reale che devo affrontare per
convertire una mia applicazione che presso alcuni clienti gira ancora sotto
Access! Do per scontato che il db di destinazione sia
stato già creato, non è questo lo scopo del mio post.
Torniamo a noi. Vado su Start --> Tutti i programmi -->
Microsoft SQL Server 2005 --> SQL Server Business Intelligence Development
Studio. Ok, mi si apre Visual Studio 2005. Creiamo un nuovo progetto:
se abbiamo fatto l'installazione come si deve, abbiamo un folder chiamato
Business Intelligence Project. In questo folder, troviamo
l'Integration Services Project. Selezioniamolo, diamo un nome
al progetto (TestDB) e clicchiamo
Ok.
Visual Studio 2005 mi apre un bel designer. Dalla toolbox prendo l'item
Data Flow Task e lo trascino sulla "superficie" su cui posso
disporre tutti gli elementi che fanno parte del progetto. Clicco con il pulsante
destro, vado in edit del nuovo oggetto appena creato. Si apre
un altro designer, che entra nel dettaglio di quello che deve fare il mio data
flow task. Ok, come giustamente mi suggerisce il designer ho bisogno di un
source e di un destination. Seleziono un
OLE DB Source, lo trascino e lo configuro, facendolo puntare al
mio database Access, selezionando la tabella Input e
così via. Fatto questo, prelevo un nuovo oggetto, un SQL Server
Destination. Prendo la freccina verde dell'OLE DB Source e la collego a
quest'ultimo, per dire al motore di SQL Server come trasferire i dati.
Ci siamo quasi. Vado in edit sul SQL Server Destination,
configuro la connessione facendola puntare al SQL Server localhost (nel mio caso), al database TestDB e alla tabella Output. Nella
scheda Mappings specifico come voglio effettivamente trasferire
i records da una tabella all'altra: nel nostro caso è piuttosto semplice, ho
solo un campo sia da una parte che dall'altra per cui alla fine vi trovate in
una situazione analoga a questa rappresentata sotto:
La tabella a sinistra è quella in Access, quella a destra è in SQL Server
2005. Riassumendo, quindi, voglio trasferire un campo Data/Ora
di Access ad un datetime di SQL Server 2005 (ecco, dopo un
lungo giro di parole, il titolo del post ). Sembra essere tutto logico e corretto, ma quando
confermo cliccando su Ok SQL Server mi segnala nella Error List
un validation error che dice quanto segue:
Error 1 Validation error. Data Flow Task: SQL
Server Destination [34]: The column "DataServizio" can't be inserted because the
conversion between types DT_DATE and DT_DBTIMESTAMP is not supported.
E' una segnalazione molto strana, perchè io non uso un timestamp da nessuna
parte, e non riesco a venirne a capo. Ho googlato un po' alla ricerca della soluzione, ma ho
trovato solamente 5 risultati. Ciò nonostante, ho trovato questa pagina su un forum di MSDN che adesso sono un po'
troppo ko per leggere (e soprattutto capire), ma me la stampo e più di
tardi vedo di cavare un ragno dal buco.