Domanda

Ho un database di SQL Server 2000 con una colonna di tipo VARCHAR (255). Tutti i dati sono NULL, o dati numerici con un massimo di due punti di precisione (per esempio '11 .85' ). Ho provato a eseguire la seguente query T-SQL, ma ha ricevuto l'errore 'Errore che converte il tipo di dati varchar in numerico'

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

Ho provato una specifica fusione di più, che non è riuscito.

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

Ho anche provato il seguente per vedere se i dati non è numerico, e gli unici valori restituiti erano NULL.

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

Ho cercato di convertire in altri tipi di dati, come ad esempio FLOAT e denaro, ma solo denaro era successo. Così ho provato il seguente:

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

... che ha lavorato bene. Tutte le idee perché la query originale non è riuscito? Ci sarà un problema se io primo convertito al denaro e poi in decimale?

Grazie!

È stato utile?

Soluzione

E 'probabile che questo dipende dal fatto che il simbolo decimale è una virgola o un punto. Qui ci sono alcune domande dei test ei relativi risultati:

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

La documentazione per ISNUMERIC dice:

  

ISNUMERIC restituisce 1 quando l'ingresso   Valuta expression per una valida   intero, numero in virgola mobile, soldi   o decimale tipo; altrimenti restituisce   0

Sia 3.6 e 3,6 può essere lanciato a money, ecco perché i rendimenti isnumeric('3,6') 1.

Per risolvere questo problema, sostituire la virgola è con i puntini (o viceversa, se il vostro sistema usi virgola come simbolo decimale):

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

Un'altra opzione è quella di cambiare il "simbolo decimale" in Windows. E 'nel Pannello di Configurazione -> internazionali e della lingua -> Formati -> Impostazioni aggiuntive -.> Numero

Altri suggerimenti

Un'altra causa è stringhe vuote. Ad esempio, se si utilizza la procedura guidata di importazione per importare un file CSV, i campi vuoti diventeranno stringhe vuote, non nulli.

Questo è un idioma comune per fissare questo:

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

Seleziona CAST (IsNull (MyColumn, 0) come decimale (4,2)) FROM [MyTable];

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top