Linked Server para MySQL erro de Null Expected | Fabrizzio A. Caputo
Linked Server para MySQL erro de Null Expected
Hoje em dia é muito comum muitos sistemas utilizarem mais de um banco de dados, isso é teoricamente bom, do ponto de vista aonde é possivel se economizar com um PostGre ou MySQL, investir mais em um Microsoft SQL Server ou Oracle, o problema acaba ficando para os desenvolvedores ou as pessoas que estão no dia-a-dia em relação a compatibilidade.
Não possui ainda um conhecimento aprofundado sobre MySQL, e hoje em um cliente, precisava fazer um linked server com origem do Microsoft SQL Server e destino MySQL.
A criação do linked server em si é bem tranquila, o Driver ODBC do MySQL funciona muito bem, portanto, sua criação e selects estavam funcionando.
O problema foi encontrado em relação a massa de dados, mais especificamente com dados do tipo Data.
Ao pesquisar sobre o MySQL, verifiquei que o mesmo não restringe valores do tipo: 2011-11-31, ou seja, um dia inexistente no calendario gregoriano, o que a empresa afirma é que essas tratativas devem vir da aplicação e não do banco.
Buscar de uma base MySQL, dados de uma tabela, cujo um dos campos era Data.
[Source MYSQL [1]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code:
An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 10.0"  Hresult: 0x80004005  Description:
"Um valor NULL inesperado foi retornado para a coluna "[LinkedServerName]...[TableName].calldate" pelo provedor
do OLE DB "MSDASQL" para o servidor vinculado "LinkedServerName". Esta coluna não pode ser NULL.".
An unexpected NULL value was returned for column "[MSDASQL].TableName" from OLE DB provider "MSDASQL" for
linked server "LinkedServerName". This column cannot be NULL.
Executar a query via OPENQUERY, o por que disso:
Como o MySQL não verifica a validade de uma data e o Microsoft SQL Server sim, ao realizar qualquer meio de conversão com funções convert, cast ou até isnull, ele dava erro, pois simplismente o Microsoft SQL Server não conseguia ler os dados.
Caso voce tenha testado isso via Integration Service (SSIS), vera que sua task de inserção foi OK, isso por que todos os dados lidos foram inseridos, mas a task de leitura com erro, pois ele não conseguiu ler.
Ja com a utilização do OPENQUERY, estamos passando para o destino, uma query a ser executada, no caso, o select, ai sim podemos dentro dele utilizar as funções do proprio MySQL, como um cast para texto simples, chegando assim um texto no Microsoft SQL Server e não uma data invalida.