Pergunta

Eu tenho um banco de dados SQL Server 2000 com uma coluna do tipo Varchar (255). Todos os dados são nulos ou dados numéricos com até dois pontos de precisão (por exemplo, 11 .85 '). Tentei executar a seguinte consulta t-sql, mas recebi o erro 'Erro convertendo o tipo de dados varchar em numérico'

SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];

Eu tentei um elenco mais específico, que também falhou.

SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];

Eu também tentei o seguinte para ver se algum dado não é numérico e os únicos valores retornados foram nulos.

SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;

Tentei converter para outros tipos de dados, como flutuação e dinheiro, mas apenas o dinheiro foi bem -sucedido. Então eu tentei o seguinte:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

... o que funcionou muito bem. Alguma idéia de por que a consulta original falhou? Haverá um problema se eu primeiro converter em dinheiro e depois para decimal?

Obrigado!

Foi útil?

Solução

É provável que isso dependa se o símbolo decimal é uma vírgula ou um ponto. Aqui estão algumas consultas de teste e seus resultados:

select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1

A documentação para Isnumeric diz :

Retornos isnuméricos 1 Quando a expressão de entrada avalia para um número inteiro válido, número de ponto flutuante, dinheiro ou tipo decimal; Caso contrário, ele retorna 0

Ambos 3.6 e 3,6 pode ser lançado para money, entao e por isso isnumeric('3,6') retorna 1.

Para resolver esse problema, substitua os vírgulas por pontos (ou vice -versa, se o seu sistema usar vírgula como símbolo decimal):

select cast(replace('3,6',',','.') as decimal)

Outra opção é alterar o "símbolo decimal" no Windows. Está no painel de configuração -> regional e idioma -> formatos -> Configurações adicionais -> números.

Outras dicas

Outra causa são as cordas vazias. Por exemplo, se você usar o Assistente de importação para importar um arquivo CSV, os campos vazios se tornarão strings vazios, não nulos.

Este é um idioma comum para consertar isso:

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))

Selecione Cast (isNull (mycolumn, 0) como decimal (4,2)) de [myTable];

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top