Ich bin ein SELECT
zu tun, die CASE
nvarchar Werte in eine richtige Art zu konvertieren verwendet, etwa wie folgt:CASE THEN-Klausel immer ausgewertet
SELECT CASE
WHEN @propType = 'money' THEN convert(money, datavalue)
[...]
ELSE datavalue
END
FROM [...]
Es scheint jedoch, die convert
immer dann ausgeführt wird, auch wenn @propType
ist nicht gleich dem Geld. Runnable Beispiel:
declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select
case @proptype
when 'money' then convert(money, @val)
else @val
end
Warum ist das, und wie kann ich es umgehen? Die MSDN-Dokumentation sagt dies:
Die CASE-Anweisung seine Bedingungen nacheinander auswertet und stoppt mit der ersten Bedingung, deren Bedingung erfüllt ist. In einigen Fällen wird ein Ausdruck ausgewertet, bevor eine CASE-Anweisung die Ergebnisse des Ausdrucks als Eingabe empfängt. Fehler in Auswertung dieser Ausdrücke sind möglich. Aggregierte Ausdrücke, die erscheinen, wenn WHEN Argumente zu einer CASE-Anweisung zuerst ausgewertet werden, dann , die der CASE-Anweisung bereitgestellt werden. Zum Beispiel erzeugt die folgende Abfrage einen Fehler durch Division durch Null, wenn der Wert des MAX Aggregats erzeugt wird. Dies geschieht vor dem Auswerten des CASE-Ausdrucks.
Ich bin mir nicht sicher, ob das relevant ist, aber die Sprache ist etwas schwer für einen Nicht-Muttersprachler, also vielleicht ist es?
Der einzige Zweck ausdrücklich ein 'varchar' zu' money' Umwandlung, wenn es implizit zurück in 'varchar' umgewandelt wird, afaik für Zwecke der Formatierung warum also entweder speichern Sie es nicht in der erforderlichen Formatierung zu beginnen mit oder lassen Sie den Client die Formatierung behandeln? –
Die Quelldaten unterliegen nicht meiner Kontrolle. Im konkreten Fall muss ich ziemlich viele Sprünge durchlaufen, um die Daten in ein solches Format zu bringen, dass ich sie in die Berichtstabelle einfügen kann, für die sie bestimmt ist (die richtig getippt ist) – carlpett