none
erro em procedure RRS feed

  • Pergunta

  • Estou utilizando o sql 2008 R2, por enqyanto

    Eu tenho uma Procedure que faz o instert em uma tabela que criei, ela sempre funcionou atá a versão fo sistema TOTVS RM 12.1.19 , atualizei para a versão 12.1.24 e ela não esta mais funcionando, quando tento executar ela, apresenta a seguinte mensagem: 

    "Msg 8152, Level 16, State 14, Line 1
    String or binary data would be truncated.
    The statement has been terminated."

    A Funsão da procedure é criar um sequencial para que possa ser gerado etiquetas sequenciais para uns produtos que são vendidos em KG.

    Veja a procedure a baixo.

    CREATE PROCEDURE [dbo].[GERAETIQUETA] 
    @NOTAFISCAL VARCHAR(35) 

    AS

    WITH
      PASS0 AS ( SELECT 1 AS C UNION ALL SELECT 1 ) , 
      PASS1 AS ( SELECT 1 AS C FROM PASS0 AS A , PASS0 AS B ) , 
      PASS2 AS ( SELECT 1 AS C FROM PASS1 AS A , PASS1 AS B ) , 
      PASS3 AS ( SELECT 1 AS C FROM PASS2 AS A , PASS2 AS B ) , 
      PASS4 AS ( SELECT 1 AS C FROM PASS3 AS A , PASS3 AS B ) , 
      TALLY AS ( SELECT ROW_NUMBER() OVER (ORDER BY C ) AS SEQUENCIAL FROM PASS4 ) 

    INSERT INTO ZNOVAETIQUETA 

    SELECT
    ROW_NUMBER () OVER (ORDER BY I.IDMOV) AS IDSEQ , 
    M.IDMOV , 
    P.IDPRD , 
    M.CODCOLIGADA , 
    P.NOMEFANTASIA , 
    LP.NUMLOTEFABRICANTE , 
    LP.DATAFABRICACAO , 
    LP.DATAVALIDADE , 
    (I.QUANTIDADETOTAL / ISNULL(I.VALOROPFRM1,1)) AS PESOLIQUIDOI , 
            (ISNULL(SUBSTRING (T4.CODTB4FAT,5,7),0) + ISNULL ( T4.COMISSAO,0 ) ) AS PESOBRUTOI , 
    F.NOME , 
    M.NUMEROMOV , 
    CONVERT(VARCHAR, ROW_NUMBER () OVER (ORDER BY I.IDMOV)) + ' / ' + convert(VARCHAR, ISNULL(M.QUANTIDADE,1) ) AS SEQ ,
    P.DESCRICAO , 
    M.QUANTIDADE , 
    I.QUANTIDADETOTAL , 
            ISNULL(SUBSTRING (T4.CODTB4FAT,5,7),0) as EMBAL , 
    M.PESOBRUTO AS PESOBRUTOM , 
    M.PESOLIQUIDO AS PESOLIQUIDOM , 
    M.CODTMV , 
    ISNULL(I.VALOROPFRM1,1) AS VOLUMES

    FROM TMOV M (NOLOCK)  
    INNER JOIN TITMMOV I (NOLOCK) ON I.CODCOLIGADA = M.CODCOLIGADA AND I.IDMOV = M.IDMOV 
    INNER JOIN TPRD P (NOLOCK) ON P.CODCOLIGADA = I.CODCOLIGADA AND P.IDPRD = I.IDPRD 
    INNER JOIN TITMLOTEPRD L (NOLOCK) ON L.CODCOLIGADA = I.CODCOLIGADA AND L.IDMOV = I.IDMOV AND L.NSEQITMMOV = I.NSEQITMMOV 
    INNER JOIN TLOTEPRD LP (NOLOCK) ON LP.CODCOLIGADA = P.CODCOLIGADA AND LP.IDPRD = P.IDPRD AND LP.IDLOTE = L.IDLOTE 
    INNER JOIN FCFO F (NOLOCK) ON F.CODCOLIGADA = M.CODCOLCFO AND F.CODCFO = M.CODCFO 
    INNER JOIN TTB4 T4 (NOLOCK) ON T4.CODCOLIGADA = I.CODCOLIGADA AND T4.CODTB4FAT = I.CODTB4FAT 
    INNER JOIN TALLY T (NOLOCK) ON T.SEQUENCIAL <= I.VALOROPFRM1  

    WHERE M.CODTMV like '2.2.%' 
    AND M.DATAEMISSAO >= (GETDATE () - 190) 
    and M.NUMEROMOV = @NOTAFISCAL 
    AND M.IDMOV NOT IN (SELECT IDMOV FROM ZNOVAETIQUETA ) 

    ORDER BY M.IDMOV , I.NUMEROSEQUENCIAL 

    GO

    Obs.: Já tentei gerar os dados por meio da sentenla SQL da Proc e realizar o insert, porém apresenta o mesmo erro.

    Será que se eu recriar a tabela a proc volta a funcionar?

    Desde já muito obrigado

    quinta-feira, 11 de julho de 2019 02:30

Respostas

  • O correto deve ser assim: 1/2.0000
    Ele esta gerando assim:    1 / 2.000
    Por algum motivo ele esta acrescentando espaço e com isso gerando o erro

    Os espaços a mais estão aqui:
           + ' / ' +

    Para não gerar estes espaços, substitua por
          + '/' +

    ---

    Mas acho que ainda assim deve ficar atento ao tamanho da coluna SEQ, na tabela ZNOVAETIQUETA, que possui o tamanho de 9 caracteres. Você comentou que o correto seria "1/2.0000"; ou seja, se o primeiro valor já ocupa 8 caracteres então o maior valor será "99/2.0000", que é o limite para 9 caracteres. Se houver mais de 99 linhas, ocorrerá novamente o erro "String or binary data would be truncated".

    ---

    Outro cuidado é com relação à conversão para o tipo de dados VARCHAR, mas sem definir o tamanho máximo:

    CONVERT(VARCHAR, ROW_NUMBER () OVER (ORDER BY I.IDMOV)) + ' / ' + convert(VARCHAR, ISNULL(M.QUANTIDADE,1) ) AS SEQ ,

    Como não foi definido o tamanho em VARCHAR, pode gerar texto com até 30 caracteresem cada uma das conversões.

     

    Se esta resposta ajudou a resolver seu problema, lembre-se de marcá-la.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sexta-feira, 12 de julho de 2019 06:38
    • Sugerido como Resposta José Diz sexta-feira, 19 de julho de 2019 16:48
    • Marcado como Resposta José Diz terça-feira, 30 de julho de 2019 10:49
    quinta-feira, 11 de julho de 2019 20:54

Todas as Respostas

  • Abaixo segue as definições da tabela.

    UPDATE [CorporeRM].[dbo].[ZNOVAETIQUETA]
       SET [IDSEQ] = <IDSEQ, int,>
          ,[IDMOV] = <IDMOV, int,>
          ,[IDPRD] = <IDPRD, int,>
          ,[CODCOLIGADA] = <CODCOLIGADA, int,>
          ,[NOMEFANTASIA] = <NOMEFANTASIA, varchar(100),>
          ,[NUMLOTEFABRICANTE] = <NUMLOTEFABRICANTE, varchar(100),>
          ,[DATAFABRICACAO] = <DATAFABRICACAO, datetime,>
          ,[DATAVALIDADE] = <DATAVALIDADE, datetime,>
          ,[PESOLIQUIDOI] = <PESOLIQUIDOI, numeric(15,4),>
          ,[PESOBRUTOI] = <PESOBRUTOI, numeric(15,4),>
          ,[NOME] = <NOME, varchar(60),>
          ,[NUMEROMOV] = <NUMEROMOV, varchar(35),>
          ,[SEQ] = <SEQ, varchar(9),>
          ,[DESCRICAO] = <DESCRICAO, varchar(100),>
          ,[QUANTIDADE] = <QUANTIDADE, int,>
          ,[QUANTIDADETOTAL] = <QUANTIDADETOTAL, numeric(15,4),>
          ,[EMBAL] = <EMBAL, varchar(10),>
          ,[PESOBRUTOM] = <PESOBRUTOM, numeric(15,4),>
          ,[PESOLIQUIDOM] = <PESOLIQUIDOM, numeric(15,4),>
          ,[CODTMV] = <CODTMV, varchar(10),>
          ,[VOLUMES] = <VOLUMES, numeric(15,4),>
     WHERE <Search Conditions,,>
    GO
    quinta-feira, 11 de julho de 2019 02:37
  • Estou utilizando o sql 2008 R2, por enqyanto

    Eu tenho uma Procedure que faz o instert em uma tabela que criei, ela sempre funcionou atá a versão fo sistema TOTVS RM 12.1.19 , atualizei para a versão 12.1.24 e ela não esta mais funcionando, quando tento executar ela, apresenta a seguinte mensagem: 

    "Msg 8152, Level 16, State 14, Line 1
    String or binary data would be truncated.
    The statement has been terminated."

    A Funsão da procedure é criar um sequencial para que possa ser gerado etiquetas sequenciais para uns produtos que são vendidos em KG.

    (...)
    Obs.: Já tentei gerar os dados por meio da sentenla SQL da Proc e realizar o insert, porém apresenta o mesmo erro.

    Será que se eu recriar a tabela a proc volta a funcionar?

    A mensagem de erro é "String or binary data would be truncated". Como deve saber, esse erro ocorre ou quando se tenta armazenar em uma coluna um texto maior do que o tamanho máximo especificado ("String data") ou quando tenta-se armazenar um valor numérico maior do que permitido no tipo de dados da coluna numérica ("binary data").

    Por exemplo, se a coluna NOME está declarada como varchar(10) e o código tenta armazenar nela o texto
            ABCDEOLIVEIRAQUATRO
    o erro é detectado e a mensagem de erro é emitida, para evitar o truncamento.

    O mesmo para uma coluna do tipo tinyint, que aceita valores de 0 a 255. Se o código tenta armazenar nela o valor 1000, então novamente o erro é detectado e a mensagem de erro é emitida.

    No seu caso, você cita que a única alteração foi atualização de versão do software da Totus. Verifique se em alguma coluna das tabelas de origem houve ampliação no tamanho de coluna e agora gera esse erro ao tentar gravar na tabela ZNOVAETIQUETA. Outra possibilidade é que o número de linhas geradas foi em tal quantidade que estourou a capacidade da primeira coluna da tabela ZNOVAETIQUETA, em que fica armazenado o valor gerado por row_number().

    O mesmo erro pode ocorrer em parâmetros. Verifique também se o procedimento armazenado está sendo chamado com texto maior do que 35 caracteres.

    De qualquer forma, me parece que a restrição de armazenamento está na tabela ZNOVAETIQUETA. Compare o tamanho de cada coluna dessa tabela com a coluna (ou expressão) de origem.

     

    Se esta resposta ajudou a resolver seu problema, lembre-se de marcá-la.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quinta-feira, 11 de julho de 2019 10:56
    quinta-feira, 11 de julho de 2019 09:13
  • Agradeço a ajuda

    Eu verifiquei se o tamanho dos dados que estão sendo gerados por meio do SCRIPT são maiores que os campos da tabela ZNOVAETIQUETA e pelo que identifiquei são todos menores.

    A tabela também não tem limitação de tamanho pra inserir dados, de qualquer forma eu recriei a tabela com outro nome e totalmente vazia e tentei fazer o Insert, apresentou a mesma mensagem de erro.

    Estou tentando revalidar os dados.

    quinta-feira, 11 de julho de 2019 10:04
  • Eu verifiquei se o tamanho dos dados que estão sendo gerados por meio do SCRIPT são maiores que os campos da tabela ZNOVAETIQUETA e pelo que identifiquei são todos menores.

    No caso da seguinte linha de código:

       CONVERT(VARCHAR, ROW_NUMBER () OVER (ORDER BY I.IDMOV)) + ' / ' + convert(VARCHAR, ISNULL(M.QUANTIDADE,1) ) AS SEQ ,

    como não se definiu o tamanho em VARCHAR, pode gerar texto com até 30 caracteres. Isto é, convert (varchar, ...) é a mesma coisa que conver(varchar(30), ...).

    A coluna de destino dessa expressão está declarada com tamanho 9. Eis um potencial problema.

     

    Se esta resposta ajudou a resolver seu problema, lembre-se de marcá-la.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quinta-feira, 11 de julho de 2019 10:55
    quinta-feira, 11 de julho de 2019 10:29
  • Bom dia

    Aparentemente eu descobri onde esta o problema, no campo criado SEQ que é utilizado para criar o sequencial de 1 até N, ao fazer o insert neste campo o SCRIP esta gerando a informação errada.

    O correto deve ser assim: 1/2.0000

    Ele esta gerando assim:    1 / 2.000

    Por algum motivo ele esta acrescentando espaço e com isso gerando o erro, vou tratar este erro e ver se o problema é resolvido de vez.

    Obs. Para eu descobrir o erro eu realizei o Insert com apenas os campos ID informados e os outros todos NULL, e fui realizando UPDATE campo a campo, até ele apresentar o erro, com isso consegui achar o possivel problema.

    Estarei atuando na correção deste erro e quem sabe acaba os meus problemas.

    Por hora, agradeço muito a ajuda.

    quinta-feira, 11 de julho de 2019 10:57
  • O correto deve ser assim: 1/2.0000
    Ele esta gerando assim:    1 / 2.000
    Por algum motivo ele esta acrescentando espaço e com isso gerando o erro

    Os espaços a mais estão aqui:
           + ' / ' +

    Para não gerar estes espaços, substitua por
          + '/' +

    ---

    Mas acho que ainda assim deve ficar atento ao tamanho da coluna SEQ, na tabela ZNOVAETIQUETA, que possui o tamanho de 9 caracteres. Você comentou que o correto seria "1/2.0000"; ou seja, se o primeiro valor já ocupa 8 caracteres então o maior valor será "99/2.0000", que é o limite para 9 caracteres. Se houver mais de 99 linhas, ocorrerá novamente o erro "String or binary data would be truncated".

    ---

    Outro cuidado é com relação à conversão para o tipo de dados VARCHAR, mas sem definir o tamanho máximo:

    CONVERT(VARCHAR, ROW_NUMBER () OVER (ORDER BY I.IDMOV)) + ' / ' + convert(VARCHAR, ISNULL(M.QUANTIDADE,1) ) AS SEQ ,

    Como não foi definido o tamanho em VARCHAR, pode gerar texto com até 30 caracteresem cada uma das conversões.

     

    Se esta resposta ajudou a resolver seu problema, lembre-se de marcá-la.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sexta-feira, 12 de julho de 2019 06:38
    • Sugerido como Resposta José Diz sexta-feira, 19 de julho de 2019 16:48
    • Marcado como Resposta José Diz terça-feira, 30 de julho de 2019 10:49
    quinta-feira, 11 de julho de 2019 20:54