none
Conversão de Dados RRS feed

  • Pergunta

  • Boa noite,
    Preciso de uma ajuda de vocês, estou com um problema no meu sistema ERP que o pessoal não consegui resolver. Está apresentando essa mensagem abaixo de erro na descida dos dados da base principal para o sistema de loja.

    Erro ao Transmitir XML de Download para o Serviço da Loja  Tabela:BIOMETRIAS  A conversão implícita do tipo de dados nvarchar(max) em varbinary(max) não é permitida. Use a função CONVERT para executar essa consulta.  A conversão implícita do tipo de dados nvarchar(max) em varbinary(max) não é permitida. Use a função CONVERT para executar essa consulta.

    Verificando a trigger da tabela biometrias, ela está programada conforme a query abaixo:

     
    IF @@ROWCOUNT = 0 RETURN  
     
     
    DECLARE @TABELA_DESTINO AS VARCHAR(255) = 'BIOMETRIAS'  
    DECLARE @TEM_DELETED    AS BIT = 0  
    DECLARE @TEM_INSERTED   AS BIT = 0  
    DECLARE @TIPOCOMANDO    AS VARCHAR(10)  
    DECLARE @CHAVE          AS XML = '<Chave>  
                    <KeyName>BIOMETRIA</KeyName>  
                    </Chave>'  
     
    IF EXISTS (SELECT TOP 1 1 FROM INSERTED) SET @TEM_INSERTED = 1  
     
    IF EXISTS (SELECT TOP 1 1 FROM DELETED) SET @TEM_DELETED = 1  
     
     
    IF @TEM_DELETED  = 1 AND @TEM_INSERTED = 1 SET @TIPOCOMANDO = 'updated'  
    ELSE  
    IF @TEM_DELETED = 0 SET @TIPOCOMANDO = 'inserted'  
    ELSE SET @TIPOCOMANDO = 'deleted'  
     
    IF @TIPOCOMANDO = 'deleted'  
     BEGIN  
     
     INSERT INTO ERPM_DOWNLOAD ( BANCO_DE_DADOS,  
            CONTEUDO,  
            DATA_HORA,  
            DESTINO,  
            EMPRESA,  
            ORIGEM )  
           SELECT 'LOJA' AS BANCO_DE_DADOS,  
            CONVERT(XML, '<Transacao Tabela="'+ @TABELA_DESTINO +'" TipoComando="'+ UPPER(LEFT(@TIPOCOMANDO , 1)) +'">' +  
            CONVERT(VARCHAR(MAX), @CHAVE) + (
           
            SELECT   A.BIOMETRIA    AS BIOMETRIA  
              ,A.DATA_HORA    AS DATA_HORA  
              ,A.TIPO      AS TIPO  
              ,A.CODIGO     AS CODIGO  
              ,A.STATUS     AS STATUS  
              ,A.NITGEN_ISDB    AS NITGEN_ISDB  
               FOR XML PATH('Linha'), ELEMENTS XSINIL ) + '</Transacao>') AS CONTEUDO,  
            GETDATE()       AS 'DATA_HORA',  
            @TABELA_DESTINO AS 'DESTINO',  
            B.LOJA          AS 'EMPRESA',  
            @TIPOCOMANDO    AS 'ORIGEM'  
             FROM DELETED           A  
             JOIN LOJAS             B ON 1 = 1 AND B.ATIVA = 'S'  
     
    END  
    ELSE  
    BEGIN  
     
    INSERT INTO ERPM_DOWNLOAD ( BANCO_DE_DADOS,  
                                CONTEUDO,  
                                DATA_HORA,  
                                DESTINO,  
                                EMPRESA,  
                                ORIGEM )  
                         SELECT 'LOJA' AS BANCO_DE_DADOS,  
                                CONVERT(XML, '<Transacao Tabela="'+ @TABELA_DESTINO +'" TipoComando="'+ UPPER(LEFT(@TIPOCOMANDO , 1)) +'">' +  
                               CONVERT(VARCHAR(MAX), @CHAVE) + (  
                              SELECT  
             A.BIOMETRIA    AS BIOMETRIA  
            ,A.DATA_HORA    AS DATA_HORA  
            ,A.TIPO      AS TIPO  
            ,A.CODIGO     AS CODIGO  
            ,A.STATUS     AS STATUS  
            ,CONVERT(VARBINARY(MAX),C.NITGEN_ISDB)    AS NITGEN_ISDB  
            ,C.VENDEDOR              AS VENDEDOR  
                            FOR XML PATH('Linha'), ELEMENTS XSINIL ) + '</Transacao>') AS CONTEUDO,  
                                GETDATE()       AS 'DATA_HORA',  
                                @TABELA_DESTINO AS 'DESTINO',  
                                B.LOJA          AS 'EMPRESA',  
                                @TIPOCOMANDO    AS 'ORIGEM'  
                           FROM INSERTED          A  
                           JOIN LOJAS             B ON 1 = 1  AND B.ATIVA = 'S'  
            join BIOMETRIAS_EXPORTACAO_LOJAS C ON C.BIOMETRIA = A.BIOMETRIA  
     
    END

    Poderiam me ajudar com esse problema?

    quarta-feira, 20 de novembro de 2019 04:05

Todas as Respostas

  • Deleted
    quarta-feira, 20 de novembro de 2019 04:12
  • Hugo,

    Você já tem 60% do caminho apresentando, pois uma das maiores dificuldades é justamente identificar em qual parte do sistema este tipo de inconsistência e erros acontece.

    Pois bem, você já tem a mensagem de alerta sendo apresentando, destacando a ocorrência de falhas de conversão de dados e sugerindo o uso da função Convert(), desta forma, a solução também já esta apresentada, neste caso, o que precisamos entender é em qual momento esta falha é apresentada.

    Esta trigger esta sendo disparada em qual momento:

    - Quando acontece um Insert, Update ou Delete em qual tabela?

    Verifique este linha de código implementada na trigger:  CONVERT(VARBINARY(MAX),C.NITGEN_ISDB) AS NITGEN_ISDB, é um indicativo que nesta nesta parte esta ocorrendo a falha.

    Você já tentou alterar esta conversão de Varbinary(Max) para Varchar() ou NVarchar()?

    Uma dica, você conhece as funções de captura e tratamento de erros implementadas a partir da versão 2005?

    Dentre elas:

            ERROR_NUMBER() ASErrorNumber 
            ,ERROR_SEVERITY()
    ASErrorSeverity 
            ,ERROR_STATE()
    ASErrorState 
            ,ERROR_PROCEDURE()
    ASErrorProcedure 
            ,ERROR_LINE()
    ASErrorLine 
            ,ERROR_MESSAGE()
    ASErrorMessage;

    Seria interessante implementar em seu trigger um bloco de código Begin...Try... Begin....Catch para termos uma identificação de em qual linha esta ocorrendo o erro.

    Veja este exemplo, com base na documentação oficial Microsoft:

    BEGIN TRY  
        -- Generate a divide-by-zero error.  
        SELECT 1/0;  
    END TRY  
    BEGIN CATCH  
        SELECT  
            ERROR_NUMBER() AS ErrorNumber  
            ,ERROR_SEVERITY() AS ErrorSeverity  
            ,ERROR_STATE() AS ErrorState  
            ,ERROR_PROCEDURE() AS ErrorProcedure  
            ,ERROR_LINE() AS ErrorLine  
            ,ERROR_MESSAGE() AS ErrorMessage;  
    END CATCH;  
    GO  


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 20 de novembro de 2019 12:12
  • Boa noite, pessoal!

    o erro ocorre no Insert e update.

    Referente a pergunta ma dica, você conhece as funções de captura e tratamento de erros implementadas a partir da versão 2005? Não conheço, mas irei verificar.

    Obrigado, pela ajuda.

    quinta-feira, 21 de novembro de 2019 01:37
  • Deleted
    quinta-feira, 21 de novembro de 2019 04:21
  • Boa noite, pessoal!

    o erro ocorre no Insert e update.

    Referente a pergunta ma dica, você conhece as funções de captura e tratamento de erros implementadas a partir da versão 2005? Não conheço, mas irei verificar.

    Obrigado, pela ajuda.

    Hugo,

    Ok, faça isso mesmo.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 21 de novembro de 2019 17:23
  • Hugo,

    Você realmente precisa fazer esta conversão no processo de Insert?

    Como seu Código já identifica qual é o evento que esta sendo processado, caberia validar e condicionar para cada tipo de evento que esta ocorrendo o tratamento específico, por isso, levanto esta questão da necessidade de conversão.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 21 de novembro de 2019 17:27