none
Tipo de Campos RRS feed

  • Pergunta

  • boa tarde...

    Seguinte eu estou com um probleminha e estou precisando disso urgente...

    Tenho uma tabela de banco de dados com um campo COD_EXTERNO do tipo Varchar(20)...

    A principio tive que colocar este campo como varchar, por que o cliente me pediu um campo para colocar letras e numeros neste campo, e agora não quer mais letras apenas números, por um motivo de duplicação de dados e etc...

    preciso tbm colocar como chave primária e não estou conseguindo

     

    o que eu preciso fazer é trocar o tipo deste campo de varchar para numeric que sera uma chave primaria

     

    obrigado pela compreenção

     

     

     

    • Tipo Alterado Gustavo Maia Aguiar sexta-feira, 27 de maio de 2011 21:30 É uma dúvida e não uma discussão
    • Movido Gustavo Maia Aguiar sexta-feira, 27 de maio de 2011 21:32 (De:SQL Server Integration Services)
    sexta-feira, 27 de maio de 2011 18:42

Respostas

  • Boa Noite,

    Verifique registros não são numericos, arrume-os e mude o tipo de dados. Para descobrir o que não é numérico use a função ISNUMERIC.

    SELECT <Colunas> FROM Tabela WHERE ISNUMERIC(Campo) = 0
    

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Richard Juhasz segunda-feira, 6 de junho de 2011 20:24
    sexta-feira, 27 de maio de 2011 21:31
  • Iraildo, só uma coisa: cuidado por que o IsNumeric entende como numeric alguns outro caracteres. Então fique atento pra isso não lhe atrapalhar.

    Books OnLine: "ISNUMERIC retorna 1 para alguns caracteres que não são números, como mais (+), menos (-) e símbolos de moeda válidos como o cifrão ($)."

    O exemplo abaixo demostra isso. Veja que o Select não retornará os dois últimos registros cadastrados.

    Create Table #Tabela (Codigo VarChar(20))

    Insert Into #Tabela Values ('001'), ('002'), ('0+1'), ('0$1'), ('+01'), ('$01')

    Select Codigo From #Tabela Where ISNUMERIC(Codigo) = 0 

    Além disso, partindo do princípio que agora você só tem códigos com números, tome cuidado porque como seu campo não era chave primária, você talvez tenha códigos duplicados. Faça essa "limpa" também. Segue exemplo de como verificar:

    Drop Table #Tabela

    Create Table #Tabela (Codigo VarChar(20))

    Insert Into #Tabela Values ('001'), ('002'), ('001')

    Select Codigo, Qt = COUNT(*) From #Tabela Group by Codigo Having COUNT(*) > 1

    Enfim, rs, estando tudo certo com o campo código, resta-nos alterar o tipo do campo e colocá-lo como chave primária:

    Drop Table #Tabela

    Create Table #Tabela (Codigo VarChar(20))

    Insert Into #Tabela Values ('001'), ('002'), ('003')

     

    Alter Table #Tabela Alter Column Codigo Int Not Null

    Alter Table #Tabela Add Constraint pk_Codigo Primary Key (Codigo)


    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    • Marcado como Resposta Richard Juhasz segunda-feira, 6 de junho de 2011 20:24
    sábado, 28 de maio de 2011 16:45
  • Iraildo,

    Em qual posição do seu campo as letras estão armazenadas, a algum tempo atrás eu tipo um problema parecido com o seu, mas as letras estavam armazenadas nas 3 primeiras posições, desta forma:

    1- eu consegui dividir este campo em dois, através do substring;

    2- copiei as letras para outro campo;

    3- depois realizei um replace nestas posições, deixando somente os números;

    4- por fim alterei o tipo do campo, para Int.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    • Marcado como Resposta Richard Juhasz segunda-feira, 6 de junho de 2011 20:24
    domingo, 29 de maio de 2011 13:20
    Moderador

Todas as Respostas

  • Boa Noite,

    Verifique registros não são numericos, arrume-os e mude o tipo de dados. Para descobrir o que não é numérico use a função ISNUMERIC.

    SELECT <Colunas> FROM Tabela WHERE ISNUMERIC(Campo) = 0
    

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Richard Juhasz segunda-feira, 6 de junho de 2011 20:24
    sexta-feira, 27 de maio de 2011 21:31
  • Iraildo, só uma coisa: cuidado por que o IsNumeric entende como numeric alguns outro caracteres. Então fique atento pra isso não lhe atrapalhar.

    Books OnLine: "ISNUMERIC retorna 1 para alguns caracteres que não são números, como mais (+), menos (-) e símbolos de moeda válidos como o cifrão ($)."

    O exemplo abaixo demostra isso. Veja que o Select não retornará os dois últimos registros cadastrados.

    Create Table #Tabela (Codigo VarChar(20))

    Insert Into #Tabela Values ('001'), ('002'), ('0+1'), ('0$1'), ('+01'), ('$01')

    Select Codigo From #Tabela Where ISNUMERIC(Codigo) = 0 

    Além disso, partindo do princípio que agora você só tem códigos com números, tome cuidado porque como seu campo não era chave primária, você talvez tenha códigos duplicados. Faça essa "limpa" também. Segue exemplo de como verificar:

    Drop Table #Tabela

    Create Table #Tabela (Codigo VarChar(20))

    Insert Into #Tabela Values ('001'), ('002'), ('001')

    Select Codigo, Qt = COUNT(*) From #Tabela Group by Codigo Having COUNT(*) > 1

    Enfim, rs, estando tudo certo com o campo código, resta-nos alterar o tipo do campo e colocá-lo como chave primária:

    Drop Table #Tabela

    Create Table #Tabela (Codigo VarChar(20))

    Insert Into #Tabela Values ('001'), ('002'), ('003')

     

    Alter Table #Tabela Alter Column Codigo Int Not Null

    Alter Table #Tabela Add Constraint pk_Codigo Primary Key (Codigo)


    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    • Marcado como Resposta Richard Juhasz segunda-feira, 6 de junho de 2011 20:24
    sábado, 28 de maio de 2011 16:45
  • Iraildo,

    Em qual posição do seu campo as letras estão armazenadas, a algum tempo atrás eu tipo um problema parecido com o seu, mas as letras estavam armazenadas nas 3 primeiras posições, desta forma:

    1- eu consegui dividir este campo em dois, através do substring;

    2- copiei as letras para outro campo;

    3- depois realizei um replace nestas posições, deixando somente os números;

    4- por fim alterei o tipo do campo, para Int.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    • Marcado como Resposta Richard Juhasz segunda-feira, 6 de junho de 2011 20:24
    domingo, 29 de maio de 2011 13:20
    Moderador