Encontrei um problema hoje e, embora tenha conseguido corrigi-lo, não tenho certeza do que causou o problema.
Eu tenho uma coluna que é Varchar(20). Ele é usado para armazenar apenas os dados do ano (2010, 2011, etc.) que está sendo convertido para um tipo de dados Int, mas quando o comando abaixo é executado, ocorre um código de erro.
ALTER TABLE mytable ALTER COLUMN1 int NULL
O erro exibido é:Conversion failed when converting the varchar value '2010. ' to data type int.
Existem 3 linhas na tabela com o valor de 2010 na Coluna1, mas NENHUMA linha com '2010. '
(ponto e 10 espaços) como valor. eu corri
select len(Column1) from MyTable where Column1 like '%2010%'
Eu tenho 2 linhas com comprimento 4 e 1 com comprimento 5. Depois de atualizar a linha com comprimento 5 para ter 2010 como valor, a tabela pode ser alterada.
Estou curioso de onde veio o período e os espaços daqui. Também curioso como o aumento de 1 caractere resulta em um ponto e 10 espaços. Estou pensando em algo como um retorno de carro ou alimentação de linha, mas não consigo encontrar nenhum dado para fazer backup disso, é apenas um palpite.
LEN() na maioria das distribuições SQL não inclui espaços. Você gostaria de usar algo como DATALENGTH() para isso. https://stackoverflow.com/questions/1151693/len-vs-datalength-in-sql-server-2005 Quanto a onde o '.' e os espaços vieram, precisaríamos de mais informações como como esse campo está sendo preenchido? Qual aplicativo, diretamente via SQL, etc.
Além disso, seria útil saber qual distribuição você está usando. Assumi o SQL Server.
Você precisaria determinar exatamente qual caractere estava na string original. Espero que você tenha uma cópia do original em algum lugar. Eu estou supondo que não era realmente um ponto final, mesmo que fosse exibido como um. Esta consulta pode ajudar
O CTE é apenas uma tabela de números rápidos dimensionada estaticamente para a largura declarada da coluna. Ele retornará uma linha por posição de caractere possível nos dados de entrada.
A consulta principal usa a saída do CTE como um índice ordinal para extrair um caractere por vez.