none
Juntar Informacoes RRS feed

  • Pergunta

  • Prezados Boa tarde!

    tenho a SQL abaixo que me retornas as informações que preciso.

    SQL

    SELECT
    X.COD_PESS_EMPR,

    I.NUM_UNID ,
    X.COD_PESS_EMPR,

     FROM XVENDA  AS X (NOLOCK)

    me retorna

    10     04  00410

    eu preciso que retorne dessa forma

    10.04.00410

    estou tentando fazer dessa forma porem retorna erro. usando o + '.' + SPACE(5) +

    SELECT
    X.COD_PESS_EMPR + '.' + SPACE(5) + I.NUM_UNID AS CHAVE,
    X.COD_PESS_EMPR,
    x.NUM_UNID,
    FROM XVENDA  AS X (NOLOCK)

    Erro

    Msg 245, Level 16, State 1, Line 1

    Conversion failed when converting the varchar value '.' to data type int.

    segunda-feira, 23 de dezembro de 2013 18:55

Respostas

  • Pelo que eu vi, NUM_SUB_UNID é um campo varchar (voce pode conferir isso para nós?). Se vc garantir que este campo possui somente numeros (isso é importante para que o código a seguir funcione) entao vc pode fazer isso:

    Convert(varchar,X.COD_PESS_EMPR) + '.'  + Convert(varchar,I.NUM_UNID)+ '.' +
    + Convert(varchar,Convert(int,I.NUM_SUB_UNID)) AS CHAVE


    Ou seja, vc converte NUM_SUB_UNID para int para remover os zeros.. e depois convert novamente para concatenar.... o SPACE(0) é inutil, uma vez que ele nao acrescenta nada

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    segunda-feira, 23 de dezembro de 2013 19:41
  • E com o SQL Server 2012 você ainda pode usar a função CONCAT

    SELECT
    CONCAT(X.COD_PESS_EMPR,'.',SPACE(5),I.NUM_UNID) AS CHAVE

    Já em versões anteriores ao SQL Server 2012, você terá de transformar os valores numéricos em String/varchar, ou seja

    SELECT
    cast(LTrim(RTrim(X.COD_PESS_EMPR)) as varchar(10)),'.',SPACE(5),cast(LTrim(RTrim(I.NUM_UNID)) as varchar(10)) AS CHAVE
    

    • Marcado como Resposta Ronnie Von segunda-feira, 30 de dezembro de 2013 11:10
    domingo, 29 de dezembro de 2013 09:49

Todas as Respostas

  • O problema é que o SQL usa o tipo do primeiro argumento para saber se o + é concatenaçao ou soma.

    Neste caso seu X.COD_PESS_EMPR é um campo int que faz com que o + seja interpretado como soma.. dai o erro, vc esta tentando SOMAR um numero com '.'.

    Para resolver isso faça:

    SELECT 
    convert(varchar,X.COD_PESS_EMPR) + '.' + SPACE(5) + convert(varchar,I.NUM_UNID) AS CHAVE,
    X.COD_PESS_EMPR,
    x.NUM_UNID,
    FROM XVENDA  AS X (NOLOCK)

    Nao entendi da onde vem esse campo "I.NUM_UNID", vistio que na sua query nao tem nenhuma tabela "I".

    Outra coisa que eu nao entendi é o uso do SPACE.. se vc precisa disso: 10.04.00410... o que o space vai fazer é isso: "10.     04"

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    segunda-feira, 23 de dezembro de 2013 19:05
  • Ficou bacana demais , Muito Obrigado, porem vejam que podem me ajuda de novo.

    convert(varchar,X.COD_PESS_EMPR) + '.' + SPACE(0) + convert(varchar,I.NUM_UNID)+ '.' + SPACE(0)
    + convert(varchar,I.NUM_SUB_UNID) AS CHAVE

    Resultado

    11.03.000404

    eu preciso tirar os Zeros do 000404

    convert(varchar,I.NUM_SUB_UNID)

    • Marcado como Resposta Ronnie Von segunda-feira, 30 de dezembro de 2013 11:09
    • Não Marcado como Resposta Ronnie Von segunda-feira, 30 de dezembro de 2013 11:09
    segunda-feira, 23 de dezembro de 2013 19:24
  • Pelo que eu vi, NUM_SUB_UNID é um campo varchar (voce pode conferir isso para nós?). Se vc garantir que este campo possui somente numeros (isso é importante para que o código a seguir funcione) entao vc pode fazer isso:

    Convert(varchar,X.COD_PESS_EMPR) + '.'  + Convert(varchar,I.NUM_UNID)+ '.' +
    + Convert(varchar,Convert(int,I.NUM_SUB_UNID)) AS CHAVE


    Ou seja, vc converte NUM_SUB_UNID para int para remover os zeros.. e depois convert novamente para concatenar.... o SPACE(0) é inutil, uma vez que ele nao acrescenta nada

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    segunda-feira, 23 de dezembro de 2013 19:41
  • E com o SQL Server 2012 você ainda pode usar a função CONCAT

    SELECT
    CONCAT(X.COD_PESS_EMPR,'.',SPACE(5),I.NUM_UNID) AS CHAVE

    Já em versões anteriores ao SQL Server 2012, você terá de transformar os valores numéricos em String/varchar, ou seja

    SELECT
    cast(LTrim(RTrim(X.COD_PESS_EMPR)) as varchar(10)),'.',SPACE(5),cast(LTrim(RTrim(I.NUM_UNID)) as varchar(10)) AS CHAVE
    

    • Marcado como Resposta Ronnie Von segunda-feira, 30 de dezembro de 2013 11:10
    domingo, 29 de dezembro de 2013 09:49
  • Galera Obrigado a todos pelas dicas, conseguimos chegar no resultado esperado.

    Ótimo 2014 para todos.

    segunda-feira, 30 de dezembro de 2013 11:11
  • O problema é que o SQL usa o tipo do primeiro argumento para saber se o + é concatenaçao ou soma.

    Neste caso seu X.COD_PESS_EMPR é um campo int que faz com que o + seja interpretado como soma.. dai o erro, vc esta tentando SOMAR um numero com '.'.

    Para resolver isso faça:

    SELECT 
    convert(varchar,X.COD_PESS_EMPR) + '.' + SPACE(5) + convert(varchar,I.NUM_UNID) AS CHAVE,
    X.COD_PESS_EMPR,
    x.NUM_UNID,
    FROM XVENDA  AS X (NOLOCK)

    Nao entendi da onde vem esse campo "I.NUM_UNID", vistio que na sua query nao tem nenhuma tabela "I".

    Outra coisa que eu nao entendi é o uso do SPACE.. se vc precisa disso: 10.04.00410... o que o space vai fazer é isso: "10.     04"

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    William,

        Permita-me discordar de duas das suas informações:

         - "O problema é..." - Não há nenhum problema no SQL em relação a conversão. O que existe é uma regra de precedência no momento da conversão. Prefiro dizer que isso é Feature, não um problema.

         - "... o SQL usa o tipo do primeiro argumento para saber se o + é concatenaçao ou soma" - O SQL Server utiliza a regra de precedência para determinar se o + é uma concatenação ou uma soma. Neste caso específico, o SQL verifica que o campo char tem regra de precedência menor do que o campo int e tenta converter o char em int. Como ele não consegue, dispara o erro, independentemente da posição dos argumentos. Maiores informações no BOL sob o tópico Data Type Precedence (Transact-SQL) Veja o exemplo abaixo:

    DECLARE @CampoInt AS INT = 1
    SELECT '.' + @CampoInt -- Vai dar Erro
    
    --Msg 245, Level 16, State 1, Line 3
    --Conversion failed when converting the varchar value '.' to data type int.
    


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    segunda-feira, 30 de dezembro de 2013 13:43
    Moderador
  • Concordo com vc Roberto.. quando eu disse "Problema" eu quis dizer "Causa do erro gerado" e não que o comportamento seja um problema. Isto pode dar uma interpretação que a Feature é Bug.. Vou tomar mais cuidado nos próximos posts.

    E realmente não é o primeiro argumento que faz com que o operador seja interpretado como soma ou concatenação e sim os tipos envolvidos na operação como você disse... eu sabia que existia uma precencia de tipos, mas achei que a precedência era posicional. Vivendo e aprendendo :)

    Mas como eu disse, para que a concatenação seja feita de forma correta, o campo "int" deve ser convertido primeiramente em "varchar".

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 30 de dezembro de 2013 15:58