Parfois, vous devez faire un peu de travail supplémentaire lors de l'intégration de deux programmes SGBD différents. Voici une solution de contournement que nous avons utilisée pour aider un client qui rencontrait des problèmes lors de la tentative d'intégration de SQL Server à MySQL.
Le client obtenait l'erreur suivante dans SQL Server lorsqu'il travaillait avec une colonne MySQL TIMESTAMP.
select * from openquery(MYSQL, 'select lastupdated from carriers') Error converting data type DBTYPE_DBTIMESTAMP to datetime2.
La raison sous-jacente était que dans la base de données MySQL du client, des valeurs DATE, DATETIME ou TIMESTAMP non valides étaient automatiquement converties en zéros (c'est-à-dire '0000-00-00' ou '0000-00-00 00:00:00') . Un mois ou un jour nul n'est pas une combinaison date/heure valide dans SQL Server. Pour contourner ce problème, nous avons d'abord converti la colonne revenant de MySQL en char(20):
select * from openquery(MYSQL, 'select cast(lastupdated as char(20) ) as lastupdated from carriers')
La valeur de la colonne '0000-00-0000:00:00' a ensuite été convertie en NULL :
select case lastupdated when '0000-00-00 00:00:00' then null else lastupdated end as lastupdated from openquery(MYSQL, 'select cast(lastupdated as char(20) ) as lastupdated from carriers')
Enfin, pour ramener la colonne "lastupdated" à une datetime2, nous avons exécuté :
select cast(x.lastupdated as datetime2) as lastupdated from ( select case lastupdated when '0000-00-00 00:00:00' then null else lastupdated end as lastupdated from openquery(MYSQL, 'select cast(lastupdated as char(20) ) as lastupdated from carriers limit 100') ) x