none
Conversion failed when converting the varchar to data type int RRS feed

  • Pergunta

  • Bom dia galera,

    Estou tentando fazer um comando, aparentemente simples porem está dando erro.

    select a.dsassunto, an.nmarquivo, p.cdchamada, p.nmpessoa
    from Atendimento a 
    left join pessoa p on (a.idpessoa = p.idpessoa)
    inner join anexo an on (a.IdAtendimento= an.IdEntidadeOrigem)
    where a.Idtipoatendimento = '00A000000N'
    Erro:
    Msg 245, Level 16, State 1, Line 1
    Conversion failed when converting the varchar value '00A000000O' to data type int.

    Acredito que o erro está no Where, pois eu fiz com outra condição e passou, mas com essa ai que eu realmente preciso não ta indo.

    O idtipoatendimento é um campo do tipo (identificador(char(10)),null)

    Abraços.

    sexta-feira, 3 de janeiro de 2020 10:56

Respostas

  • Deleted
    • Marcado como Resposta Alex_SidFiscal sexta-feira, 3 de janeiro de 2020 16:05
    sexta-feira, 3 de janeiro de 2020 15:10
  • Alex,

    Estou entrando no post para tentar ajudar. Respondendo a sua pergunta no post anteriormente, tendo como base o resultado que você apresentou:

    TABLE_NAME COLUMN_NAME      DATA_TYPE CHARACTER_MAXIMUM_LENGTH
    Anexo         IdEntidadeOrigem     char                 10
    Atendimento IdTipoAtendimento   char                 10
    Atendimento IdEntidadeOrigem    char                 10
    Atendimento IdAtendimento          int                 NULL 

    - Uma alternativa na muito interessante seria fazer uso da função Convert ou Cast na condição da sua junção.

    Veja o exemplo:

    -- Utilizando a Função Convert --
    select a.idatendimento, an.IdEntidadeOrigem --, a.dsassunto, an.nmarquivo, p.cdchamada, p.nmpessoa
    from Atendimento a 
    left join pessoa p on (a.idpessoa = p.idpessoa)
    inner join anexo an 
            on Convert(Char(10),a.IdAtendimento) = Convert(Char(10),an.IdEntidadeOrigem)
    where an.IdEntidadeOrigem = '8183'
    Go
    
    -- Utilizando a Função Cast --
    select a.idatendimento, an.IdEntidadeOrigem --, a.dsassunto, an.nmarquivo, p.cdchamada, p.nmpessoa
    from Atendimento a 
    left join pessoa p on (a.idpessoa = p.idpessoa)
    inner join anexo an 
          on Cast(a.IdAtendimento As Char(10)) = Cast(an.IdEntidadeOrigem As Char(10))
    where an.IdEntidadeOrigem = '8183'
    Go

    Reforço a observação feito pelo outro argumentandor, você esta utilizando em uma condição de junção tipos de dados diferentes, comparando Char(10) com INT, isso esta obrigatoriamente forçando o Query Processor a realizar a conversão implícita para estabelecer um formato reconhecível e que permita ser comparado.

    Neste caso, valide a sua condição de junção ou até mesmo se for possível poderia alterar fisicamente o tipo de dados utilizado na tabela Atendimento para o atribuito IdAtendimento, deixando o mesmo similar ao que esta sendo utilizando na tabela Anexo.

    Veja o exemplo abaixo:

    -- Alterando o tipo de dados --
    Alter Table Atendimento
     Alter Column IDAtendimento Char(10)
    Go

    Este procedimento vai funcionar se os dados atualmente armazenados na coluna IDAtendimento permitam ser alterados para Char(10).


    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]

    • Marcado como Resposta Alex_SidFiscal sexta-feira, 3 de janeiro de 2020 16:06
    sexta-feira, 3 de janeiro de 2020 15:26

Todas as Respostas

  • Deleted
    sexta-feira, 3 de janeiro de 2020 12:10
  • Segue resultado do comando.

    TABLE_NAME COLUMN_NAME         DATA_TYPE CHARACTER_MAXIMUM_LENGTH
    Anexo         IdEntidadeOrigem char                 10
    Atendimento IdTipoAtendimento char                 10
    Atendimento IdEntidadeOrigem char                 10
    Atendimento IdAtendimento         int                 NULL

    sexta-feira, 3 de janeiro de 2020 12:33
  • Deleted
    sexta-feira, 3 de janeiro de 2020 12:39
  • é sim. 

    select a.idatendimento, an.IdEntidadeOrigem --, a.dsassunto, an.nmarquivo, p.cdchamada, p.nmpessoa
    from Atendimento a 
    left join pessoa p on (a.idpessoa = p.idpessoa)
    inner join anexo an on (a.IdAtendimento= an.IdEntidadeOrigem)
    where an.IdEntidadeOrigem = '8183'

    rodando o comando dessa forma ele traz o resultado.

    idatendimento IdEntidadeOrigem
    8183                 8183      
    8183                 8183      
    8183                 8183      

    Então como converter para que o from se relacione corretamente?

    sexta-feira, 3 de janeiro de 2020 13:08
  • Deleted
    • Marcado como Resposta Alex_SidFiscal sexta-feira, 3 de janeiro de 2020 16:05
    sexta-feira, 3 de janeiro de 2020 15:10
  • Alex,

    Estou entrando no post para tentar ajudar. Respondendo a sua pergunta no post anteriormente, tendo como base o resultado que você apresentou:

    TABLE_NAME COLUMN_NAME      DATA_TYPE CHARACTER_MAXIMUM_LENGTH
    Anexo         IdEntidadeOrigem     char                 10
    Atendimento IdTipoAtendimento   char                 10
    Atendimento IdEntidadeOrigem    char                 10
    Atendimento IdAtendimento          int                 NULL 

    - Uma alternativa na muito interessante seria fazer uso da função Convert ou Cast na condição da sua junção.

    Veja o exemplo:

    -- Utilizando a Função Convert --
    select a.idatendimento, an.IdEntidadeOrigem --, a.dsassunto, an.nmarquivo, p.cdchamada, p.nmpessoa
    from Atendimento a 
    left join pessoa p on (a.idpessoa = p.idpessoa)
    inner join anexo an 
            on Convert(Char(10),a.IdAtendimento) = Convert(Char(10),an.IdEntidadeOrigem)
    where an.IdEntidadeOrigem = '8183'
    Go
    
    -- Utilizando a Função Cast --
    select a.idatendimento, an.IdEntidadeOrigem --, a.dsassunto, an.nmarquivo, p.cdchamada, p.nmpessoa
    from Atendimento a 
    left join pessoa p on (a.idpessoa = p.idpessoa)
    inner join anexo an 
          on Cast(a.IdAtendimento As Char(10)) = Cast(an.IdEntidadeOrigem As Char(10))
    where an.IdEntidadeOrigem = '8183'
    Go

    Reforço a observação feito pelo outro argumentandor, você esta utilizando em uma condição de junção tipos de dados diferentes, comparando Char(10) com INT, isso esta obrigatoriamente forçando o Query Processor a realizar a conversão implícita para estabelecer um formato reconhecível e que permita ser comparado.

    Neste caso, valide a sua condição de junção ou até mesmo se for possível poderia alterar fisicamente o tipo de dados utilizado na tabela Atendimento para o atribuito IdAtendimento, deixando o mesmo similar ao que esta sendo utilizando na tabela Anexo.

    Veja o exemplo abaixo:

    -- Alterando o tipo de dados --
    Alter Table Atendimento
     Alter Column IDAtendimento Char(10)
    Go

    Este procedimento vai funcionar se os dados atualmente armazenados na coluna IDAtendimento permitam ser alterados para Char(10).


    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]

    • Marcado como Resposta Alex_SidFiscal sexta-feira, 3 de janeiro de 2020 16:06
    sexta-feira, 3 de janeiro de 2020 15:26
  • obrigado, agora foi certinho.


    sexta-feira, 3 de janeiro de 2020 16:07
  • obrigado, agora foi certinho.


    Alex,

    Que bom, ficamos a disposiçã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]

    sexta-feira, 3 de janeiro de 2020 18:37