Frage

In unserer Anwendung werden wir Benutzer werden, so dass in arithmetischen Ausdrücken geben (+ - * /) mit anderen Datenbankspalten für Zahlen, die dann von der Anwendung analysiert werden würden und in die Datenbank als eine berechnete Spalte geschrieben.

Allerdings gibt es Probleme, die mit so dass Anwender entstehen Ausdrücke erstellen, die Ausnahmen dazu führen können, wenn Sie die Tabelle, wie Division durch Null select *, Arithmetik-Überlauf und mögliche andere, die ich noch nicht begegnet (obwohl ich denken , die alle von ihnen ist).

eine Ausnahme der Datenbank werfen, auf select * wäre absolut verheerend. Ich würde eher versuchen, ihren Ausdruck in etwas neu zu schreiben, die elegant würde scheitern, wenn sie fehleranfällig Daten haben.

Für Division durch Null die Lösung ist ziemlich einfach:

add [Col] as case {divisor} when 0 then N'DIVIDE-BY-ZERO' else {expression} end

Meine Frage ist, was kann mich für arithmetischen Überlauf zu tun? Zeige Koje oder offensichtlich falsche Daten in der Spalte wäre kein Problem sein, aber werfen Ausnahmen würde.

War es hilfreich?

Lösung

Ich hasse es sehen Sie eine Antwort akzeptieren, die nicht wirklich Sie näher an Ihr Ziel.

Als eine separate Antwort, die Ihnen helfen könnte ein wenig raus, du können machen berechnete Spalten nennen eine (deterministisch) skalare UDF.

Siehe zum Beispiel hier

Wenn Sie also eine berechnete Spalte erstellen werden, macht es die Spalten zu einer dynamisch erzeugten UDF übergeben (oder mehreren UDF) und die Arbeit dort. In einem skalaren UDF, können Sie viel Code haben, die Probleme zu fangen, aber man kann immer noch nicht TRY/CATCH verwenden. Was können Sie in Ihrem skalare UDF zu tun ist, fangen Fälle und entsprechende Antworten zurückgeben (sprudelt NULLs, wahrscheinlich).

Aber Leistung wird sehr Armen auf skalare UDF (nicht sicher nicht beharrte Inline berechnete Spalten vs. UDF, wir hauptsächlich beharrte Nutzung), so dass Sie ernsthaft die Säule beibehalten machen vielleicht prüfen , der Raum dann in der Datenbank und Make-Einsätzen und aktualisiert ein wenig langsamer verwenden. Das ist ein großer Kompromiss.

Andere Tipps

Da Sie Technologie haben Parsen, können Sie die Ausdrücke zu stoppen alle möglichen Probleme mit einem Bündel von CASE-Anweisungen neu schreiben -. Division durch Null, überläuft, um verschiedene Arten Upcasting, etc

Aber ich würde das nicht tun, weil ich glaube nicht, diese in die Datenbank setzen als Teil des Schemas ist eine großartige Idee, es sei denn, dieses Tool ein Code-Generierungs-Tool ist nd Benutzer sind verantwortlich für die Überprüfung und das Testen der Ausdrücke für die Randbedingungen, als ob sie in dem ursprünglichen Datenbank-Design enthalten waren.

Wenn Sie bereits den Ausdruck Parsen, ich würde das kompilieren auf der Client-Seite, auch, und behandeln den Fehler auf einer Zeile-für-Zeile-Basis.

die Ausnahme Beschäftigte mit try / catch ist ein alles oder nichts Szenario nicht auf einer Zeile-für-Zeile-Basis.

Wie fangen über die Ausnahmen? Es scheint schwer zu versuchen, alle möglichen Ursachen für arithmetische Überläufe zu erkennen, geschweige denn Ausnahmen im Allgemeinen lassen.

Auf Ausnahmen können Sie eine Unsinn Ergebnismenge zurück, die mit dem ursprünglichen benutzerdefinierter kompatibel ist eines:

begin try
    select exp(999)
end try
begin catch
    select 1
end catch 

Wenn die Leistung wichtig ist, verwenden Sie einen Trigger oder indizierte Sicht die Berechnungen zu speichern, wenn die Daten eingefügt, aktualisiert oder gelöscht werden.

Wenn die Leistung nicht wichtig ist, verwenden Sie eine skalare Wertfunktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top