none
Migração de Base Access para SQL 2005 RRS feed

  • Pergunta

  • Boa Noite.

     

    Estou tentando migrar uma base de dados Access para SQL 2005 atraves do SQL Server Import e Export Wizard, só que em determinado ponto da conversão ocorre o erro descrito abaixo. Pelo que ententi tem algo a ver com o campo DataNascimento. O estranho é que olhando a base Access, vejo que não há nada de errado com o campo data de nascimento.

     

    Copying to [JJControle_CasaOliveira].[dbo].[Clientes] (Error)

    MessagesError 0xc0202009: Data Flow Task: An OLE DB error has occurred. Error code: 0x80004005.
    An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80004005 Description: "Invalid character value for cast specification".
    (SQL Server Import and Export Wizard)

    Error 0xc020901c: Data Flow Task: There was an error with input column "DataNascimento" (161) on input "Destination Input" (116). The column status returned was: "Conversion failed because the data value overflowed the specified type.".
    (SQL Server Import and Export Wizard)

    Error 0xc0209029: Data Flow Task: The "input "Destination Input" (116)" failed because error code 0xC020907A occurred, and the error row disposition on "input "Destination Input" (116)" specifies failure on error. An error occurred on the specified object of the specified component.
    (SQL Server Import and Export Wizard)

    Error 0xc0047022: Data Flow Task: The ProcessInput method on component "Destination - Clientes" (103) failed with error code 0xC0209029. The identified component returned an error from the ProcessInput method. The error is specific to the component, but the error is fatal and will cause the Data Flow task to stop running.
    (SQL Server Import and Export Wizard)

    Error 0xc0047021: Data Flow Task: Thread "WorkThread0" has exited with error code 0xC0209029.
    (SQL Server Import and Export Wizard)

     

    Algum dos colegas poderia me exclarecer sobre este erro? 

     

    Obrigado.

     

    quarta-feira, 13 de fevereiro de 2008 20:22

Respostas

  • José,

     

    Veja se assim funciona:

     

    Code Snippet

    ALTER TABLE TabelaComQuaseTodosOsCampos

     ADD DataNascimento SMALLDateTime

     

    SET DATEFORMAT DMY

     

    UPDATE TabelaComQuaseTodosOsCampos

    SET DataNascimento = CAST(TabelaComApenasAData.DataNascimento AS SMALLDATETIME)

    FROM TabelaComQuaseTodosOsCampos Inner Join TabebalComApenasAData

                                                            On TabelaComQuaseTodosOsCampos.Codigo = TabelaComApenasAData.Codigo

     

    DROP TABLE TabelaComApenasAData

     

     

     

     

    quarta-feira, 20 de fevereiro de 2008 14:04

Todas as Respostas

  • Boa Noite,

     

    O Export / Import Wizard é ótima para migrações mais triviais, mas ele tem uma limitação (perfeitamente compreensível, mas é uma limitação). Quando utilizamos os índices, pks, fks e constraints não são importados / exportados juntamente com os dados. Dada essa limitação, o mais recomendável é utilizar o assistente de Upsizing do Access para exportar os dados juntamente com a estrutura.

     

    Mas voltando ao seu problema, o SQL Server pode trabalhar com datas considerando escopos diferentes (servidor, usuário, sessão, etc). Isso significa que o servidor pode estar habilitado para trabalhar com datas no formato dd/mm/yyyy e para um usuário individual elas podem ser trabalhadas no formato yyyy/mm/dd.

     

    Como o Access não possui tal nível de separação, é possível que o Regional Settings esteja influenciando nessa importação. Para resolver esse problema é preciso descobrir qual é o Regional Settings do local onde o Access está e qual é a configuração (Language) do usuário utilizado para conexão. Se o arquivo do Access está em um computador com o Regional Settings em Português (dd/mm/yyyy) e o usuário utilizado para conectar ao SQL Server possui a propriedade Language em Inglês (mm/dd/yyyy) poderá ocorrer esse erro.

     

    Alterar Regional Settings pode representar um efeito indesejado já que outros aplicativos podem ser afetados. A alteração de um usuário no SQL Server (ou até a criação de um usuário para esse fim) é menos traumática. Para alterar a propriedade Language do usuário, abra o SQL Server Management Studio e clique sobre esse usuário com o botão direito.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 13 de fevereiro de 2008 20:50
  • Gustavo, obrigado por me responder, mas,

     

    O problema é que depois de 12000 registros importados eu tenho este erro e mesmo apagando o registro que seria importado antes do erro, o erro persiste no próximo registro. Com base nisso, acho que a situação apresentada não se enquadraria como resposta ao meu problema.

     

    O que você acha? Alguma outra idéia?

     

    Obrigado.

     

    segunda-feira, 18 de fevereiro de 2008 13:39
  •  

    José,

     

    É exatamente nos 12000 registros?? Não existe qualquer diferença nos dados entre o último registro importado e os seguintes???

     

     

    Abraço!!!

    segunda-feira, 18 de fevereiro de 2008 13:45
  • José Acilio,

     

    Você já verificou como esta este registro armazenado no Access?

     

    Será que existe alguma informação que possa estar gerando esta incosistência?

     

    segunda-feira, 18 de fevereiro de 2008 13:54
  • Olá José,

     

    Façamos então o seguinte teste:

     

    - Importe os registros do Access para o SQL Server sem o campo DataNascimento

    - Importe uma nova tabela apenas com o ID e o campo DataNascimento (Convertido para Texto)

    - Converte o campo DataNascimento da segunda tabela em formato texto para tipo data (já no SQL Server)

    - Atualize a 1ª tabela (a que tem todos os campos) com base nessa segunda tabela

     

    Vamos ver se as ferramentas permitem que a gente execute pelo menos o primeiro passo. Se conseguirmos executar o primeiro passo com êxito, eliminaremos a possibilidade de algo estar relacionado ao tipo DataNascimento

     

    [ ]s,

     

    Gustavo

    segunda-feira, 18 de fevereiro de 2008 14:40
  • Bom, são importados exatamente 12410 registros, e não existem nenhum problema com o próximo, ou seja, a data de nascimento é um valor correto. Por exemplo no momento atual, depois de ter apagado o registro onde o erro era gerado, o registro que seria importado contém a seguinte data de nascimento: 15/11/1965.

     

    Alguma dica?

     

    Obrigado.

     

    segunda-feira, 18 de fevereiro de 2008 14:40
  • Olá José,

     

    Você consegue realizar a importação seguindo as etapas que indiquei ? Se tirar o campo Data o registro passa ?

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 18 de fevereiro de 2008 14:52
  • Vamos lá.

     

    Passo 1 - a tabela foi importada com sucesso sem o campo data de nascimento;

    Passo 2 - uma nova tabela com o campo data de nascimento convertido para texto foi também importada com sucesso;

    Passo 3 - ocorre o erro abaixo na tentativa de converter o campo texto para datetime:

     

    - Unable to modify table. 
    Arithmetic overflow error converting expression to data type datetime.
    The statement has been terminated.

     

     

    Obrigado.

     

    segunda-feira, 18 de fevereiro de 2008 14:58
  • Olá José,

     

    Isso é um bom sinal. Sua desconfiança parece confirmar-se em relação ao campo DataNascimento. Se você o importou no formato dd/mm/yyyy para o SQL Server, antes de convertê-lo, use o comando SET DATEFORMAT DMY

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 18 de fevereiro de 2008 15:39
  • Gustavo, desculpe pelos meus pobres conhecimentos sobre o SQL Server, mas como e onde eu vou executar este comando?

     

    Obrigado.

     

    segunda-feira, 18 de fevereiro de 2008 17:20
  • Olá José,

     

    Não há nenhum problema com o seu conhecimento sobre SQL Server. Todos temos níveis diferentes e o importante é perguntar para continuar elevando-o. Vou detalhar um pouco mais minha estratégia. Suponha a seguinte tabela:

     

    Clientes (Codigo, Nome, CPF, Email, Endereco, CEP, Regiao, DataNascimento)

     

    Como pudemos observar, o campo DataNascimento estava atrapalhando a migração, então deve-se importar a tabela toda sem esse campo. Logo teremos a seguinte tabela no SQL Server

     

    Clientes (Codigo, Nome, CPF, Email, Endereco, CEP, Regiao)

     

    No Access, crie uma tabela com os seguintes campos

     

    Clientes (Codigo, DataNascimentoTexto)

     

    Nesse caso, a data de nascimento deve vir em um formato texto. Você poderá gerar essa tabela no Access com um comando semelhante a: SELECT Codigo, CSTR(Date()) FROM Cliente. Exporte essa tabela para o SQL Server

     

    Agora temos duas tabelas no SQL Server. Uma tem quase todos os campos e outra tem apenas a data de nascimento no formato texto (no formato DMY eu presumo). Rode o seguinte comando:

     

    Code Snippet

    ALTER TABLE TabelaComQuaseTodosOsCampos ADD DataNascimento SMALLDateTime

    SET DATEFORMAT DMY

    UPDATE TabelaComQuaseTodosOsCampos

    SET DataNascimento = CAST(TabelaComApenasAData.DataNascimento AS SMALLDATETIME)

    FROM TabelaComQuaseTodosOsCampos.Codigo = TabelaComApenasAData.Codigo

    DROP TABLE TabelaComApenasAData

     

     

    Esses comandos podem ser executados no SQL Management Studio.

     

    [ ]s,

     

    Gustavo

    segunda-feira, 18 de fevereiro de 2008 17:31
  • Bom dia.

     

    Ao executar o código que me foi informado recebi a seguinte mensagem de erro:

     

    Msg 102, Level 15, State 1, Line 2

    Incorrect syntax near '='.

     

     

    O que deu errado?

     

    Obrigado pela ajuda.

    quarta-feira, 20 de fevereiro de 2008 14:00
  • José,

     

    Veja se assim funciona:

     

    Code Snippet

    ALTER TABLE TabelaComQuaseTodosOsCampos

     ADD DataNascimento SMALLDateTime

     

    SET DATEFORMAT DMY

     

    UPDATE TabelaComQuaseTodosOsCampos

    SET DataNascimento = CAST(TabelaComApenasAData.DataNascimento AS SMALLDATETIME)

    FROM TabelaComQuaseTodosOsCampos Inner Join TabebalComApenasAData

                                                            On TabelaComQuaseTodosOsCampos.Codigo = TabelaComApenasAData.Codigo

     

    DROP TABLE TabelaComApenasAData

     

     

     

     

    quarta-feira, 20 de fevereiro de 2008 14:04
  • É... a coisa tá preta...

     

    Aparece o erro abaixo quando executei as instruções acima:

     

    Msg 8115, Level 16, State 2, Line 5

    Arithmetic overflow error converting expression to data type smalldatetime.

    The statement has been terminated.

     

     

    Uma outra pergunta: nesta tabela possuo outro dois campos data que foram importados com sucesso, por que somente este campo "DataNascimento" não pode ser importado?

     

    Obrigado pela ajuda.

    quinta-feira, 21 de fevereiro de 2008 17:44
  • Olá José,

     

    Realmente minha query estava incompleta e o JR. a corrigiu. É preciso rodar o SET DATEFORMAT de acordo com o formato da data que foi importado. Se a data tem um formato YYYMMDD, o SET DATEFORMAT deve ser YMD. Se a data tem o formato DMY, você deve usar o SET DATEFORMAT DMY. Esse passo foi realizado ?

     

    Você pode realizar esse mesmo procedimento para esses outros campos (importando inclusive os três de uma vez após a importação principal). Lembre-se que uma única data errada, anula toda a importação do registro. Será que nenhuma dessas datas estava errada e por isso a importação direta estava dando falhas ? É que a solução de fazer mais de uma importação é apenas um contorno e não uma boa solução definitiva.

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 21 de fevereiro de 2008 18:02
  • Tem alguma função que eu possa usar para verificar se existe alguma data errada? Pois em uma tabela com mais de 14000 registros, olhar registro por registro... não preciso dizer que é inviável.

     

    A única questão é que existem campos nulos, eles irão interferir no processo?

     

    Obrigado.

     

    quinta-feira, 21 de fevereiro de 2008 18:19
  • Olá José,

     

    A função ISDATE do Access pode fazer isso, mas se o campo já é uma data no Access ela irá funcionar. A solução que dei foi apenas para que tívessemos certeza de que o problema era com a data e que você conseguisse contornar o problema e fazer a importação no caso de uma emergência. Para a solução definitiva, vamos aos seguintes passos:

     

    - Verifique as configurações regionais do servidor onde está o Access e o do servidor onde está o SQL Server. Você poderá fazer isso indo no Painel de Controle e em seguida em Regional Settings (ou configurações regionais). Certifique-se colocar as mesmas configurações de data.

     

    - No SQL Server, verifique as propriedades do login de conexão e veja a propriedade Language (ou Default Language). Certifique-se de escolher um compatível com o Regional Settings. Ex: Se você escolher português Brasil no Regional Settings, escolha Portuguese (Brazil) na propriedade Language do usuário

     

    Efetue uma nova importação e vamos ver se funciona dessa forma. Estou pressupondo que todos os campos Data estão configurados como Data no Access. Isso está correto ? A propósito, quantos registros estão envolvidos ?

     

    [ ]s,

     

    Gustavo

    quinta-feira, 21 de fevereiro de 2008 18:44