2016-06-01 4 views
1

Ich habe den folgenden Code, wo ich benutze ISnumeric Funktion, um die Gültigkeit eines Ausdrucks zu überprüfen, um die Mathematik in SQL zu tun.Gibt es eine Funktion, die einen mathematischen Ausdruck überprüft und eine gültige Zahl im SQL Server zurückgibt?

Aber wenn ich ISnumeric Funktion hier verwende, gibt es 0 für beide unten aufgeführten Bedingungen zurück. Ich brauche eine Funktion oder eine Methode, um einen gültigen mathematischen Ausdruck zu identifizieren.

Gibt es eine Alternative für diesen?

Begin 
DECLARE @rcnt as VARCHAR(100) 
DECLARE @ncnt as VARCHAR(100) 
--Condition1 
SET @rcnt = '(5918800.000/4963400.000) * (Slaughter(1023))' 
--Condition2 
SET @ncnt = '(5997200.000/5059900.000) * (400000.000)' 

Select ISNUMERIC(@rcnt) as validittcheck 
Select ISNUMERIC(@ncnt) as validittcheck 

END 
+2

Nein, es gibt nichts, dass so etwas tut gebaut –

+0

'wählen isNumeric (exec (. "Wählen Sie" + @ncnt)) als Validittcheck "könnte funktionieren ... aber ich denke, Sie müssten es in einen Versuch fangen, wie das Schlachten wird fehlschlagen, es sei denn, das ist eine Funktion Ihren Code. Im Wesentlichen probieren wir es aus, wenn es gibt numerisch zurück Sie wissen, dass es gültig ist, wenn es Fehler zurückgibt, wissen Sie es nicht. – xQbert

Antwort

1

ISNUMERIC() ist eine Prüfung, dass eine Variable ein gültiger numerischer Datentyp ist, nicht, dass das Ergebnis der Auswertung eines String-Ausdrucks ein gültiger Zahlenwert ist. Ihre Werte wurden nicht-numerisch, sobald die erste '(' wurde ausgewertet.

Die einzige Weise, die ich weiß, um das gewünschte Ergebnis zu erhalten, ist die Verwendung dynamischer sql. Hier ist ein Beispiel, beachten Sie, dass ich den Versuch fangen dort ein weil Ihre Funktion Slaughter() nicht vorhanden ist und eine Ausnahme ausgelöst wird, so zurückkehren Null, da es keine Zahl ist:

DECLARE @rcnt as NVARCHAR(100) 
DECLARE @ncnt as NVARCHAR(100) 
--Condition1 
SET @rcnt = 'SELECT @Result=ISNUMERIC((5918800.000/4963400.000) * (Slaughter(1023)))' 
--Condition2 
SET @ncnt = 'SELECT @Result=ISNUMERIC((5997200.000/5059900.000) * (400000.000))' 

DECLARE @ResultValue1 INT=0 
DECLARE @ResultValue2 INT=0 
DECLARE @ResultParam NVARCHAR(100)= '@Result int OUTPUT' 

BEGIN TRY 
EXEC sp_executesql @rcnt, @ResultParam, @[email protected] OUTPUT 
END TRY 
BEGIN CATCH 
END CATCH 

BEGIN TRY 
EXEC sp_executesql @ncnt, @ResultParam, @[email protected] OUTPUT 
END TRY 
BEGIN CATCH 
END CATCH 

SELECT @ResultValue1 
SELECT @ResultValue2 
+0

Eine Alternative hinzugefügt. –

+0

Sie sollten wahrscheinlich eine Art von Health Warning hinzufügen, da dies natürlich eine SQL-Injektion Avenue ist, wenn die Quelle der Werte nicht vertrauenswürdig ist. –

+0

Nun ja, natürlich ist es. Er hatte seinen Code in einem Endblock, sodass ich annahm, dass er in einer gespeicherten Prozedur enthalten war, in der die Werte als bereinigte Parameter gesendet wurden. Ich hoffe es trotzdem :) Außerdem werde ich auf den leeren Versuch hinweisen, dass Fangen nutzlos ist und eine fürchterliche Übung ist. Ich habe gerade seinen Code zur Ausführung bekommen. Ich würde von dieser Art von Abfrage abraten, wenn Sie Ihre Werte als Parameter einreichen könnten, wäre es sauberer, effizienter und sicherer ... alles zusammen ein besserer Ansatz. –

Verwandte Themen