Inquiridor
Conversão de Dados

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
ENDPoderiam me ajudar com esse problema?
Todas as Respostas
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 21 de dezembro de 2019 23:16
-
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]
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 21 de dezembro de 2019 23:15
-
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 21 de dezembro de 2019 23:15
-
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]
-
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]
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 21 de dezembro de 2019 23:16