none
Job com Erro RRS feed

  • Pergunta

  • Pessoal, Tenho um job
    que executa um SP
    onde busca os dados de um servidor Linkado da Unisys,
    e insere este dados numa tabela local,
    estava rodando normal, de repente deu este errro

    Server: Msg 7341, Level 16, State 2, Line 1
    Could not get the current row value of column '[Tabela].mereal' from the OLE DB provider 'Unisys.DMSII.1'. Could not convert the data value due to reasons other than sign mismatch or overflow.
    [OLE/DB provider returned message: [] [[UDP]: [2043] Data Conversion failed for all items]
    [OLE/DB provider returned message: [] [[UDP]: [2119] Conversion of column 'mereal' resulted in error (2) Can't Convert]
    OLE DB error trace [OLE/DB Provider 'Unisys.DMSII.1' IRowset::GetData returned 0x80040e21:  Data status returned from the provider: [COLUMN_NAME=i250t_mereal STATUS=DBSTATUS_E_CANTCONVERTVALUE]].

    Como Resolvo isto?
    Existe uma forma de testar o campo vindo da  tabela
    antes de inserir na tabela destino

    Cenario: SQL SERVER 2000
    Tentativas: Link http://social.msdn.microsoft.com/forums/pt-br/520/thread/0BA3B448-3559-4A97-966D-7B22C1622FA2

    mas sem sucesso!


    Maricelmo
    • Movido Gustavo Maia Aguiar quinta-feira, 2 de dezembro de 2010 03:12 (De:SQL Server - Desenvolvimento Geral)
    quarta-feira, 1 de dezembro de 2010 14:25

Respostas

  • Entao Maricelmo,

    Vc experimentou aumentar o(s) timeout da conexão e da query (do linked server)?

    Uma vez, o unisys tinha gravado uns caracteres bem malucos em uns campos do tipo string... que o sql server nao reconhecia. (é que trabalhamos com um software da Attachmate que replica a base unisys para uma base sql server, o Databridge). Eu fazia com top, assim como vc, e ele retornava, se retirasse o top, dava erro. Entao Fiz uma consulta com order by na minha chave (que era um sequencial), então ele retornou varios registros até apresentar o erro. Obviamente o proximo sequencial da minha tabela (a partir do ultimo que retornou) seria o problema. Entao consultando a estrutura pelo proprio unisys com esse sequencial, descobri que haviam caracteres invalidos.

    Espero ter ajudado de alguma forma...

    att.
    Rafael

    • Marcado como Resposta Maricelmo quarta-feira, 15 de dezembro de 2010 17:31
    quarta-feira, 15 de dezembro de 2010 17:22

Todas as Respostas

  • cara, nesta procedure, quando ele pega esta data, ela está no formato correto para se inserida, pode ser que esteja trocando o mês pelo dia e ai esteja causando problemas na validação da data, veja como ela retorna e se for o caso faça um tratamento no formato da data

    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    quarta-feira, 1 de dezembro de 2010 17:39
  • Maricelmo,

    Jah tive esse problema relacionado a conversão da data do Unisys to SQL Server, pq a data no DMS é gravado com inteiro. Então na hora da conversão dava erro pq o sql server nao compreendia aquela formatação. Resolvi colocando o set dateformat ymd em todas as procedures.

    pergunta.... esta tabela (unisys) possui campos de data? Vc estah convertendo para o tipo do sql server? Qual foi a forma que vc utilizou em sua sp para carregar os dados.... insert into? cursor? Pq eu uso cursores e faço o tratamento row-by-row em todos os campos datas para evitar que o processo seja abortado...

    atenciosamente,
    Rafael Melo

    quinta-feira, 2 de dezembro de 2010 10:44
  • Então Srs.

    nesta tabela não existe campo DATA

    Abaixo esta a SP usada

    Create   PROCEDURE [dbo].[WP_Migra_Tabela01]  AS

    BEGIN TRANSACTION COMPLETA

    TRUNCATE TABLE Tabela01

    INSERT INTO Tabela01
     ( Campo1,campo2,campo3 )

     (SELECT Campo1,campo2,campo3 FROM ServerLinkado.Banco.Sessao.Tabela01)

    IF @@ERROR <> 0
     ROLLBACK TRANSACTION COMPLETA
    ELSE
    COMMIT TRANSACTION COMPLETA
    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    Rafael, Como faço para usar CURSOR
    vc tem algum exemplo, pq eh justamente isso
    que eu preciso. FAZER UM TRATAMENTO
    campo a campo.

    Agradeço


    Maricelmo
    quinta-feira, 2 de dezembro de 2010 15:08
  • Maricelmo,

    Montei rapidamente um exemplinho do uso do cursor...Espero que te ajude.

    --!Cria a temporária para o exemplo
    CREATE TABLE #TABELAUNISYS (ID INT IDENTITY, TEXTO VARCHAR(50))
    
    --!Preencho a temporária com 30 linhas
    INSERT INTO #TABELAUNISYS (TEXTO) VALUES ('TEXTOUNISYS') 
    GO 30
    
    
    --!Declaro as variáveis locais usadas na procedure
    DECLARE
    	@ID INT,
    	@TEXTO VARCHAR(50)
    
    
    --!Declaraçao de um cursor (o mais performático que eu testei) 
    DECLARE CUR_UNISYS CURSOR FAST_FORWARD FOR
    	--!Select na sua tabela de origem para preencher o cursor
    	 SELECT 
    		ID,
    		TEXTO
    	FROM #TABELAUNISYS		
    FOR READ ONLY
    --!Abre o cursor
    OPEN CUR_UNISYS
    
    --!Atribui o valor (da primeira linha do cursor) nas variáveis
    FETCH CUR_UNISYS INTO
    	@ID,
    	@TEXTO
    	 
    --!Laço para percorrer todo o cursor. Quando nao houver mais linhas, ele retorna -1
    WHILE (@@FETCH_STATUS = 0)
    BEGIN	
    	--! Aqui vc faz o tratamento row-by-row ou linha a linha...srs
    	--! No meu cenário, faço as validações, e caso esteja tudo OK com a linha, insiro na tabela destino...
    		
    	--!Exemplo mostrando o conteúdo das variáveis
    	SELECT CAST(@ID AS VARCHAR)+ ' - '+@TEXTO
    
    		
    	--!Atribui o valor nas variáveis para o próximo laço
    	FETCH CUR_UNISYS INTO	
    		@ID,
    		@TEXTO			
    END
    
    --!Fecha o cursor (importante**)
    CLOSE CUR_UNISYS
    --!Desaloca o cursor da memória (importante**)
    DEALLOCATE CUR_UNISYS
    
    att.
    Rafael Melo

    quinta-feira, 2 de dezembro de 2010 16:02
  • Maricelmo,

    Você esta realizando alguma conversão de valores?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    sexta-feira, 3 de dezembro de 2010 18:28
    Moderador
  • Pessoal,

    Testei o exemplo do rafael, porem sem sucesso!
    até carrega os dados para o destino, porem
    chega em certo ponto acontece o mesmo
    erro descrito acima

    Junior, sim estou realizando conversão de valores.

    o tipo de dado da tabela_Origem eh Decimal
    o tipo de dado da tabela_Destino eh varchar.

    alguem tem mais alguma sugestão?


    Maricelmo
    quarta-feira, 8 de dezembro de 2010 13:22
  • Maricelmo,

    Tente usar o Try Catch na insercão... O erro está aperendo no momento da inserção, neh?. No meu caso, tenho uma tabela de logs que quando uma linha falha ao inserir, eu gero uma linha de log com as chaves da tabela unisys. Pq os seus erros, são situacões especificas, senão nao inseriría nenhuma linha. Se vc logar, ou até mesmo dar um print quando der problema na inserção, vc descobrirá qual atributo está tao diferente das demais que conseguiram ser inseridas.

    Se vc ainda estiver usando o cursor, acredito que vc está fazer o insert dentro do while, certo? Caso sim, entao ficaría

    WHILE
    
     (@@FETCH_STATUS
    
     = 0) 
    BEGIN
    
     
    	TRY
    		INSERT
    
     INTO
    
     MINHATABELA(	
    			CAMPO1,
    			CAMPO2)
    		VALUES
    
    (
    			@CAMPO1,
    			@CAMPO2)
    	CATCH
    	BEGIN
    
    
    		PRINT
    
     'ATRIBUTOS\CHAVES '
    
    +@CAMPO1+ ' |'
    
     + @CAMPO2
    		--OU
    
    
    		INSERT
    
     INTO
    
     TBLOG (IDPROCEDURE, CHAVEERRO) VALUES
    
     (1,@CAMPO1+ ' |'
    
     + @CAMPO2)
    
    	END
    
    
    	--FETCH ... 
    
    
    END
    
     
    

    Ah, o try catch soh funciona com o sql2005 ou superior

    Obs.: Maricelmo, desculpe-me... Não  tinha percebido que vc jah tinha dito que usa o sql server 2000. De qualquer forma irei deixar esse  post aqui. Talvez possa ajudar-te de alguma forma.

     

    Espero ter ajudado...

    Rafael

    • Editado Rafael S. Melo quinta-feira, 9 de dezembro de 2010 11:39 Observação
    quarta-feira, 8 de dezembro de 2010 17:57
  • Obrigado Rafael!

    Vou testar assim que tiver alguma resposta. Aviso!

    Na realidade tambem tenho um servidor que tem o SQL SERVER 2008

    instalado nele e que tambem esta dando o mesmo erro, por isso

    que disse que vou testar neste servidor, de qq forma Obrigado!


    Maricelmo
    quinta-feira, 9 de dezembro de 2010 14:18
  • Srs, Me desculpe a demora
    Porem Testei como o Rafael
    falou, Mesmo assim deu este erro

    Cannot get the current row value of column "[Banco].[Tabela1].Tabela1_medidareal" from OLE DB provider "Unisys.DMSII.1" for linked server "ServerLinked".

    Alguem pode me ajudar!


    Maricelmo
    terça-feira, 14 de dezembro de 2010 17:02
  • Maricelmo,

    O erro continua sendo o mesmo?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    terça-feira, 14 de dezembro de 2010 17:20
    Moderador
  • Ola Junior

    sim, tecnicamente o erro continua
    sendo o mesmo!
    Maricelmo
    terça-feira, 14 de dezembro de 2010 17:31
  • Pessoal,
    Alguem tem mais alguma sugestão
    pois o meu estoque de recursos esta
    ficando escasso!
    Maricelmo
    quarta-feira, 15 de dezembro de 2010 12:56
  • Maricelmo,

    Quando vc faz somente o select, sem insert, sem conversão, apenas pra visualizar o dados, vc consegue recuperar todos os registros? A sua consulta termina com exito?

    att.
    Rafael

    quarta-feira, 15 de dezembro de 2010 13:52
  • Ola, Rafael

    Sua resposta eh Não,
    acontece o mesmo erro quando executo um simples select

    Select * From Servidor.Banco.dbo.Tabela1 ---- ERRO

    Select Count(*) From Servidor.Banco.dbo.Ttabela1 -- Exito

    quarta-feira, 15 de dezembro de 2010 14:55
  • Maricelmo,

    Mais algumas perguntas..rsrsrs... Mas, sua consulta chega a retornar alguns registros? Vc estah usando um linked server com OleDB da unisys certo? vc estah com o sql server 2008? ele é 64 bits? Pq tivemos problemas com 64 bits. Tem um driver especifico para ele.

    E mais,  verificar nas opções do seu linked server se o timeout da conexão e da query estah com 120000. E com com a exceção do collation name (que deve ficar em branco), todos as demais opções devem estar como  true (inclusive collation compatible e use remote collation ).

     

    att.
    Rafael

    quarta-feira, 15 de dezembro de 2010 16:17
  • Rafael,
    vamos as respostas

    sua consulta chega a retornar alguns registros?

    Sim: Caso executo

    Select Top * From Servidor.banco.dbo.tabela1

    Vc estah usando um linked server com OleDB da unisys certo?
    Correto!

    vc estah com o sql server 2008?
    Não, Estou testando com sql server 2005 64 bits

    Tem um driver especifico para ele
    Sim, peguei o Drive OleDB da Unisys 64 Bits no Site da propria Unisys.

    Linked Server Properties

    Collation Compatible = True
    Data Access = True
    Rpc = False
    Rpc Out = False
    Use Remote Collation = True
    Collation Name = Vazio!
    Connection Timeout = 0
    Query Timeout = 0


    Maricelmo
    quarta-feira, 15 de dezembro de 2010 16:37
  • Entao Maricelmo,

    Vc experimentou aumentar o(s) timeout da conexão e da query (do linked server)?

    Uma vez, o unisys tinha gravado uns caracteres bem malucos em uns campos do tipo string... que o sql server nao reconhecia. (é que trabalhamos com um software da Attachmate que replica a base unisys para uma base sql server, o Databridge). Eu fazia com top, assim como vc, e ele retornava, se retirasse o top, dava erro. Entao Fiz uma consulta com order by na minha chave (que era um sequencial), então ele retornou varios registros até apresentar o erro. Obviamente o proximo sequencial da minha tabela (a partir do ultimo que retornou) seria o problema. Entao consultando a estrutura pelo proprio unisys com esse sequencial, descobri que haviam caracteres invalidos.

    Espero ter ajudado de alguma forma...

    att.
    Rafael

    • Marcado como Resposta Maricelmo quarta-feira, 15 de dezembro de 2010 17:31
    quarta-feira, 15 de dezembro de 2010 17:22
  • Rafael,

    Foi extamente isto que eu fiz aumentar timeout da conexão e da query
    no não entendi do porque deste valor de 120000,
    porem estou desconfiando exatamente isto que voce
    descreveu, os dados na base Unisys devem estar corrompidos
    ou com caracteres inválidos!

    mesmo assim Muito Obrigado! por sua ajuda


    Maricelmo
    quarta-feira, 15 de dezembro de 2010 17:28
  • Rafael,

    voce foi em cima do problema!

    RESOLVIDO!

    descobri que haviam caracteres invalidos
    na tabela Unisys,

    foi corrigido o dado e o problema Solucionado

    Agradeço


    Maricelmo
    quarta-feira, 15 de dezembro de 2010 17:33