2017-06-05 3 views
1

Ich möchte nvarchar Daten in float Typ konvertieren.SQL: Fehler beim Konvertieren des Datentyps nvarchar in float

In meinem Fall habe ich SalesValue Spalte und ich verwendet, um dieses Kommando

UPDATE Overseas 
SET SalesValue = CONVERT(FLOAT, REPLACE([SalesValue],',','')) 

Meine Tabellenwerte wie

hat
201.01 
40.50 
215.12 
550 
304.201 

Aber ich erhalte eine Fehlermeldung

SQL: Fehler beim Konvertieren Datentyp nvarchar in float.

Wie kann ich dieses Problem lösen?

+1

Sind diese Geldbeträge? Ich würde nicht empfehlen, mit FLOAT zu beginnen. Verwenden Sie DECIMAL oder GELD. Und das Problem wird nicht mit den Dezimalwerten sein, die Sie als Beispiele angegeben haben. Es wird mit den Werten sein, die nicht in Dezimalzahlen umgewandelt werden können (wie Dollarzeichen $). –

+0

Diese Werte sind alle in den Float-Datentyp konvertierbar. SELECT CAST ('201.01' AS FLOAT) SELECT CAST ('40 .50' AS FLOAT) SELECT CAST ('215.12' AS FLOAT) SELECT CAST ('550' AS FLOAT) SELECT CAST ('304,201' AS FLOAT) – Tarzan

+0

Ist etwas anderes los? – Tarzan

Antwort

1

1. Guss Wert von unter Abfrage und dann normalerweise

SELECT 
      case when ISNUMERIC([SalesValue])=1 
      then CAST([SalesValue] AS FLOAT) else 0 end AS CastedValue) 
     FROM your_table_name 
+0

Versuchen Sie Ihren Code, wo 'SalesValue = '$'' oder 'SalesValue = '1e4'' . Ihre Methode ist fehlerhaft und Sie würden davon profitieren, [diesen Beitrag] zu lesen (https://stackoverflow.com/a/7400335/6167855) und die zugrunde liegenden Referenzen. – scsimon

+0

@scsimon können Sie Ihre Antwort mit bearbeitetem Code veröffentlichen – 3mr

1

Sie sollten die Werte finden, die nicht übereinstimmen. In SQL Server 2012+ können Sie try_convert() verwenden. Das ist nicht verfügbar. Also, wie wäre es damit?

Ich denke, dass die offensichtlichen Unregelmäßigkeiten umfasst: ein Zeichen, das nicht numerisch oder zwei (oder mehr) Dezimalstellen ist.

+0

u kann das volle Kommando schreiben? – 3mr

+0

@ 3mr. . . Sie müssen die Abfrage ausführen, um herauszufinden, was die schlechten Werte sind. Dann gehe mit ihnen entsprechend um. –

+0

Ich habe wie gesagt, aber ich lade meine Daten in der Regel und dynamisch aus der Excel-Datei .. was müssen jetzt wo sind die schlechten Werte manuell? – 3mr

0

Es klingt wie Ihre Daten immer noch etwas, das nicht numerisch ist. Ich hoffe, dass Ihre Anwendungsseite eine gute Arbeit geleistet hat, um Ihre Daten vor der Eingabe zu bereinigen, und das Problem ist wahrscheinlich, dass Sie ein "$" in einem oder mehreren Ihrer Felder haben. Der Cast wird fehlschlagen, wenn Sie einen anderen als den '.' darin (wie du wahrscheinlich weißt, weshalb du ',' entfernt hast). Ich habe das folgende Skript ausgeführt, um dies zu testen.

declare @myFloat float; 
declare @test1 nvarchar(10) = '145.88'; 
declare @test2 nvarchar(10) = '4,145.88'; 
declare @test3 nvarchar(10) = '$4,145.88'; 

SELECT ISNUMERIC(@TEST3) 
set @myFloat = CONVERT(FLOAT, REPLACE(@test1,',','')); 
select @myFloat; 

set @myFloat = CONVERT(FLOAT, REPLACE(@test2,',','')); 
select @myFloat; 

--THIS WILL FAIL 
set @myFloat = CONVERT(FLOAT, REPLACE(@test3,',','')); 
select @myFloat; 
--THIS WILL NOT FAIL 
set @myFloat = CONVERT(FLOAT, REPLACE(REPLACE(@test3,',',''),'$','')); 
select @myFloat; 

Sie können versuchen, die unten stehende Skript auf der Säule in Frage ausgeführt, welche Spalten Sie ein Problem mit haben, um zu sehen:

--run this on your table 
SELECT SalesValue 
FROM Overseas 
WHERE ISNUMERIC(REPLACE(SalesValue,',','')) = 0 

--test sample 
/* 
insert into #myTable 
values ('145.88'), 
     ('4,145.88'), 
     ('$4,145.88'), 
     ('$4,145.88%'); 

SELECT * 
FROM #myTable 
WHERE ISNUMERIC(REPLACE(amounts,',','')) = 0 
--WHERE ISNUMERIC(REPLACE(REPLACE(amounts,',',''),'$','')) = 0 --this will remove results with $ also 
*/ 

Sie fix wird also sein, einfach die Zeile, die Sie zur Verfügung gestellt ändern :

UPDATE Overseas SET SalesValue = CONVERT(FLOAT, REPLACE(REPLACE([SalesValue],',',''),'$','')) 

Es sei denn, Sie fanden andere Zeichen in den Ergebnissen des vorherigen Skripts.

+0

Ich habe unterschreiben nicht $ in meinen Werten, wie ich .. sagte bekam ich meine Daten aus Excel-Blatt und ich denke, das ist das Problem .. – 3mr

+0

Code Überprüfen Sie mit der wissenschaftlichen Schreibweise ... dh ' '1e4'' als @Test – scsimon

+0

Ich stimme mit scsimon überein. Excel versucht, "Hilfe" zu geben, indem Datentypen basierend auf einer Stichprobe von Spaltendaten ermittelt werden. Bei meinem Job habe ich ein SSIS-Paket, das Zellen in einem Excel-Dokument untersucht. Ich habe beim Testen und Produzieren festgestellt, dass, wenn die Arbeitsmappe nicht für alle Zellen "formatiert" ist oder wenn Sie aus einer anderen Quelle kopieren und einfügen (Codierungsprobleme), mein Paket die Daten nicht korrekt lesen würde. @ 3mr todo: eine leere Arbeitsmappe erhalten, alle auswählen, Zellen als Text formatieren, Daten einfügen und erneut versuchen. – chris

0

aktualisieren Dies wird Ihnen näher als ISNUMERIC()

declare @table table (SalesValue varchar(16)) 
insert into @table 
values 
('1e4'), 
('$'), 
('134.55'), 
('66,9897'), 
('14') 

select 
    SalesValue 
    ,case 
     when SalesValue NOT LIKE '%[^0-9,.]%' 
     then convert(decimal(16,4),replace(SalesValue,',','.')) 
    end 
from 
    @table 
Verwandte Themen