2017-05-04 6 views
0

Wenn ich zwei Spalten, A und B, des Datentyps Nvarchar (50), wo beide Geldwerte mit dem Währungscode (z. B. 100,00 USD), wie können Ich verwende nur den Dezimalteil in Trigger- oder Prozedurberechnungen?SQL Server arbeitet mit Dezimalteil einer Zeichenfolge in Berechnungen

Beispielsweise kann ein Nach-Trigger Insert, das den Wert B von A subtrahiert, wobei A = '300,00 USD' und B = '299,50 USD':

... AS

deklariere @a nvarchar (50);

deklarieren @ b nvarchar (50);

Deklarieren @ans Dezimal (10,2);

Wählen Sie @ a = i.A von eingefügtem i;

Wählen Sie @ b = i.B von eingefügtem i;

BEGIN

Jetzt möchte ich @ans = @a finden - @b.

END

Was erschwert es, dass ein Teil des realen Szenarios ist, wird es in einem Verfahren zu tun, das für eine Reihe von Werten testet, wo ich verschiedene Tabellen und Ausgang mit einem „wählen verbinden. ... in ".

+1

Warum die Währung nicht in einer separaten Spalte speichern? –

+0

* Verwenden Sie kein Textfeld für Dezimalzahlen. Das Problem ist die Abfrage, nicht SQL Server. Wie erwarten Sie mathematische Operationen mit * text *? Führen Sie keine Operationen mit Währungen durch. Was nützt es, * Pfund * von * Dollar * abzuziehen? –

+0

Das wäre ideal. Leider ist dies für ein Universitätsprojekt und die Normalisierung muss eingehalten werden. Die spezifische Tabelle ist für die Buchung und ich versuche, einen Gesamtpreis zu berechnen.Das dritte Normalformular lässt nicht zu, dass ein Nicht-Prime-Attribut von einem anderen Nicht-Prime-Attribut abhängt, was der Fall wäre, wenn ich die Währung in einer separaten Spalte speichern würde. – Nazgul

Antwort

1

Wenn die Währung genau drei Zeichen sind, können Sie die letzten 4 abreißen;

select cast(left(val, len(val) - 4) as decimal(10, 2)) 

Oder können Sie den ersten Raum verwenden:

select cast(left(val, charindex(' ', val)) as decimal(10, 2)) 

Ich sollte hinzufügen, dass die mehr typische Methode der Währungswerte Speichern von zwei Spalten verwendet, eine als „Geld“ oder „Dezimal“ und der andere ein Währungscode. Die einzige Zeit, in der ich das Speichern von monetären Werten als Zeichenfolgen empfehlen würde, ist in Datenbanken, die keine Festkomma-Dezimalfelder unterstützen.

Sie können den Währungscode mit right() abrufen.

+0

Danke! Ich stimme zu, separate Spalten zu haben, aber 3NF muss in meinem Fall eingehalten werden, und ein Währungscode hängt nicht von der PK der Tabelle ab. – Nazgul

1

Verwenden Convert & Replace Funktionen als nächster Code: -

declare @a nvarchar(50); 

declare @b nvarchar(50); 

declare @ans decimal(10,2); 

set @a = '300.00 USD' 
set @B = '299.50 USD' 

set @ans = convert(decimal(10,2),replace(@a,'USD','')) - 
      convert(decimal(10,2),replace(@b,'USD','')) 

select @ans 

Ergebnis: -

0.50 
+0

''1000 USD' - '500 GBP''. Trunkierung kann erlauben, dass die Anweisung ausgeführt wird, aber die Ergebnisse werden falsch sein. –

+0

Ja, ich würde Währungsumrechnung verwenden, wie an anderer Stelle erwähnt. Dies war nur ein sehr einfaches Beispiel. – Nazgul

Verwandte Themen