SQL Fehlerhafte Berechnung

Mike90

Benutzer
Beiträge
7
Hallo zusammen,

Ich will in einem View eine einfache Berechnung anstellen, allerdings setzt er beim Ergebnis die Kommas an den falschen Stellen.


Code:
SELECT dbo.Bestandsdaten.Bestand * dbo.Preis.Staps AS WertBestand


Dabei kommt das hier heraus:
Code:
Materialnummer        Stichtag      Bestand          Preis          Wertbestand
Matnummer 1            Q1              169,412        145,6700      24678246,0400
Matnummer 1            Q2              213,981        145,6700      31170612,2700
Matnummer 2            Q1              29,5              34,9600      10313,2000
Matnummer 2            Q2              29                34,9600      1013,8400



Die Werte an sich stimmen, das Komma ist aber völlig an der falschen Stelle; bei Matnummer1 um 3 Stellen nach rechts, bei Matnummer2 um eine zuweit nach rechts.


Für den Stichtag Q2 bei Matnummer2 stimmen die Daten allerdings wieder.


Ich dachte, das liegt evtl. an den Datentyp nvarchar für Bestand und wollte das in decimal(12,3) umändern.

Allerdings gibt er mir bei der Umänderung die Fehlermeldung



Errors were encountered during the save process. Some database objects were not saved.
'Bestandsdaten(dbo)' table - unable to modify table. Error converting data type nvarchar to numeric


aus.

Woher kommt die Fehlermeldung und ist die Datentypänderung überhaupt die richtige Lösung?

Vielen Dank und viele Grüße,
Mike











 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
Offensichtlich handelt es sich hier bei der Spalte Bestand um den NVARCHAR und bei Preis um einen numerischen Datentyp. Das Komma aus NVARCHAR wird nicht wie Komma sondern Punkt gesehen (US Schreibweise für tausender Trennzeichen). Du könntest also mit replace(dbo.Bestandsdaten.Bestand,',','.') arbeiten um aus dem Komma in der Zeichenkette einen Punkt (US Schreibweise für Cent Trennzeichen :) ) zu machen bevor du Berechnungen anstellst.

Außerdem sollte der Wert nicht vom SQL Server interpretiert sondern bewusst mit einer Funktion von einem in ein anderes Format konvertiert werden und gegen Fehler oder NULL Werte abgesichert werden. Um sich den ganzen Ärger zu sparen ist natürlich ein numerischer Datentyp viel besser geeignet und auch schneller.

Beim Ändern von Datentypen wäre ich aber vorsichtig:
1. Kann die Anwendung eventuell damit nicht umgehen oder macht irgendwelche Probleme und
2. Würde ich erst eine Hilfsspalte anlegen, dort die Werte reinschreiben und nach kontrolle die ursprüngliche Spalte mit diesem Werten neu erzeugen.

Dein Fehler beruht vermutlich auf NVARCHAR Werten wie Text die er nicht konvertieren konnte. Entweder hat er die jetzt beim Konvertieren raus geschmissen oder er hat die Konvertierung nicht durchgeführt.
 

ukulele

Datenbank-Guru
Beiträge
4.394
Ich kann den Fehler nicht reproduzieren weil mein SQL 2008 R2 mit NVARCHAR gar nicht erst rechnet.

Aber hier mal zum testen:
Code:
DECLARE    @test1 NVARCHAR(100),
        @test2 DECIMAL(12,4)
SET        @test1 = '169,412'
SET        @test2 = 145.67
SELECT    @test1 AS Bestand,
        replace(@test1,',','.') AS [Bestand US],
        @test2 AS Preis,
        replace(@test1,',','.') * @test2 AS Wertbestand
 
Werbung:

Mike90

Benutzer
Beiträge
7
Hallo Ukulele,

du hast Recht, Bestand ist "nvarchar" und Preis "money". Mit dem Unterschied Punkt-Komma ergeben auch die unterschiedlichen Ergebnisse einen Sinn.
Das Replacen funktionierte nicht, also hab ich die Bestandsdaten (zum Glück noch nicht viele) gelöscht, den Datentyp der entsprechenden Spalte in decimal umgeändert und dann die Daten neu hochgeladen.
Jetzt funktioniert alles wieder prima, die Ergebnisse stimmen :)

Vielen Dank!
 
Oben