Usuário com melhor resposta
Tipo de Campos

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)
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
-
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
-
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
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
-
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
-
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