Usuário com melhor resposta
Job com Erro

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)
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
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 :) -
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 -
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 -
Maricelmo,
Montei rapidamente um exemplinho do uso do cursor...Espero que te ajude.
att.--!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
Rafael Melo -
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] -
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 -
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
-
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 -
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 -
-
-
-
-
-
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 -
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 -
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
-
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 -