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.

O cenario:
Buscar de uma base MySQL, dados de uma tabela, cujo um dos campos era Data.

O erro encontrado:

Em portugues:

[Source MYSQL [1]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 

0x80004005.
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.".

Em ingles:

Msg 7342, Level 16, State 1, Line 2
An unexpected NULL value was returned for column “[MSDASQL].TableName” from OLE DB provider “MSDASQL” for 
linked server “LinkedServerName”. This column cannot be NULL.

A solução:

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.

Exemplo de utilização do OPENQUERY para este caso:

SELECT *
FROM OPENQUERY(LinkedServerName,'SELECT CAST(Data as char) FROM MySQLTabela')

Anúncios
Post a comment or leave a trackback: Trackback URL.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: