Zum Inhalt springen

Eval() in SQL


Murcks

Empfohlene Beiträge

Hallo zusammen! :)

Es gibt in VB eine Funktion Eval(). Diese Funktion liest einen mathematischen String ein und rechnet dieses aus.

Bsp.

DIM strFormel AS STRING

DIM dblLoesung AS DOUBLE

strFormel = "3 * 6 + 15/3"

dblLoesung = Eval(strFormel)

Somit wäre also dblLoesung = 23.

Meine Frage: Gibt es so eine ähnliche Funktion in SQL 2005? Falls nicht, wie könnte man soetwas in SQL bewerkstelligen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gibt es so eine ähnliche Funktion in SQL 2005?

nein.

Falls nicht, wie könnte man soetwas in SQL bewerkstelligen?

allenfalls muss das über eine benutzerdefinierte funktion gelöst werden, welche als parameter eine zeichenkette übergeben bekommt, diesen auswertet, und das ergebnis zurückliefert.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja aber der String mit der Formel (strFormel) kommt ja aus einem Programm und muss in SQL verarbeitet/ausgerechnet werden.

DECLARE @myEval AS INT

SELECT strFormel

FROM tbl_Formeln

WHERE ...

SET @myEval = strFormel

...funktioniert doch nicht, oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

In dem Programm können vom Benutzer Formeln zur Berechnung von Artikelmaßen eingegeben werden, da sich diese regelmäßig ändern.

Diese Formel wird dann zum jeweiligen Artikel in einer Tabelle in SQL gespeichert.

Diese Formel muss dann in SQL ausgerechnet werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

DECLARE @myEval AS INT


SELECT @myEval = strFormel

FROM tbl_Formeln

WHERE ...

So sollte das erstmal aussehen. Dann gibts noch die Moeglichkeit, falls @myEval wirklich ein STring ist wie '3 * 6 + 15/3' und da keine Platzhalter drin sind, dann mach folgendes

DECLARE @myEval NVARCHAR(255)


SET @myEval = '3 * 6 + 15/3'


EXEC('SELECT ' + @myEval + 'AS ERGEBNIS')

Schau dir mal diesen Code an.. vllt. hilft er ja ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Na also ich muss dir doch net alles Vorkauen oder ?

EDIT: ach quatsch ^^

Einfach das Ergebnis in FLOAT umwandeln mit nem CAST ... also am besten waers ja wenn die nummern schon als Float reinkommen ...

Also statt

3 * 6 + 15/3

besser

3.0 * 6.0 + 15.0 / 3.0

Ansonsten muesstest mal schaun ob man den String 1:1 in Float casten kann

SET @myEval = CAST(@myEval AS float)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Tja ... dann bleibt leider nur die moeglichkeit die Daten in Float direkt einzutragen:

DECLARE @myEval NVARCHAR(255)


SET @myEval = '3.0 * 6.0 + 20.0/3.0'


EXEC('SELECT ' + @myEval + 'AS ERGEBNIS')

Ich weiss, das ist leider eine schlechte Alternative.. aber fuehrt wohl kein Weg dran vorbei... ausser du schreibst ne riesen Funktion den String nach Ganzzahlen zu parsen und an jede ein '.0' anzufuegen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

OK, hab das Problem gelöst bekommen.

In der Formel war am Ende ein '/ 1000'. Das habe ich dann mittels REPLACE-Funktion durch '* 0.001' ersetzt und schon wurde das richtige Ergebnis (mit Komma) ausgegeben.

Danke für die Hilfe bis hier hin! :)

So sieht's nun aus:

DECLARE @strFormel AS VARCHAR(500)

SELECT @strFormel = '( 2 * 1273 + 2 * 3456 ) / 1000'

SET @strFormel = REPLACE(@strFormel, '/ 1000', '* 0.001')

EXEC ('SELECT ' + @strFormel + 'AS Ergebnis')

Habe jetzt schon mehrfach auf verschiedene Art und Weisen ausprobiert dieses Ergebnis in einer Variable zwischenzuspeichern, weil ich sie später noch verwenden muss.

Sämtliche Versuche sind leider fehl geschlagen. Einer vielleicht 'n Tipp? :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das geht leider nur innerhalb des EXEC selbst.. denn was intern gespeichert wurde ist extern nicht mehr aufrufbar.

Aber dann knall einfach ein riesen EXEC um deine Befehle (Mehrere moeglich... ganz normal wie sonst:

EXEC('DECLARE @strFormel AS VARCHAR(500)


SELECT @strFormel = '''( 2 * 1273 + 2 * 3456 ) / 1000'''

SET @strFormel = REPLACE(@strFormel, '''/ 1000''', '''* 0.001''')

EXEC ('''SELECT ''' + @strFormel + '''AS Ergebnis''')')

Ist leider etwas bloed, aber meines Wissens nicht anders loesbar...

Wenn du nun innerhalb des inneren EXEC es in eine Variable speicherst (SELECT @var = bla FROM sowieso) ... und dort weiterverarbeitest muesste es gehn... dumm ... aber vllt. gibts hier noch MSSQL Cracks die es besser wissen ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke euch, aber funktioniert jetzt so:

[FONT="Courier New"]EXEC ('Select ' + @strFormel)

EXEC ('Insert Into [I]Zieltabelle[/I] ([I]Ergebnis[/I]) Values (' + @strFormel + ')')[/FONT]

Wenn ich den Wert dann wieder brauche: Einfach 'n Select-Statement und den Wert wieder aus der Tabelle holen.

So isset. Danke für eure Hilfe! :D

(Kleine Frage noch am Rande: Was genau ist der Unterschied zwischen SET und SELECT? Möchte jetzt keinen neuen Thread dafür aufmachen.)

Link zu diesem Kommentar
Auf anderen Seiten teilen

mit einem SELECT gibt er dir etwas zurueck .... mit einem SET kannst du eine Variable setzen..

Also mit SET @var = 'foo'

Wird war 'foo' zugewiesen.

Mit SELECT @var

Wird @var zurueckgegeben ... ausgegeben also

Wenn du eine Variable aus einem komplexeren SELECT Statement befuellen willst, machst du einfach

SELECT @var = column FROM Table WHERE sowieso = 50

;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn man das Ergebnis der Formel schon unbedingt im SQL-Server braucht, dann haette ich eher die Anbindung eines Formel-Parsers ueber eine Extended Stored Procedure vorgeschlagen.

Goos

richtig, aber ..

kann man doch nicht im SQL Server direkt von Programm aus (VB.NET bzw. C#)

eine Prozedur schreiben um zu eben die Extended Stored Procedure umzugehen ??

Link zu diesem Kommentar
Auf anderen Seiten teilen

richtig, aber ..

kann man doch nicht im SQL Server direkt von Programm aus (VB.NET bzw. C#)

eine Prozedur schreiben um zu eben die Extended Stored Procedure umzugehen ??

Ich versteh nicht ganz was du meinst.

Versuch es doch bitte nochmal deutlicher zu machen.

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe mich kürzlich selbst mit dem Thema EXEC und Rückgabe von Werten aus diesem Kontext beschäftigen müssen.

Es gibt exakt 2 Möglichkeiten:

Im EXEC das/die Ergebnis(se) in eine temporäre Tabelle schreiben und diese aus dem aufrufenden Kontext auslesen.

Die bessere Möglichkeit:

Die Standard StoredProcedure sp_executesql. Mit dieser ist auch die Übergabe des Statement und der Parameter einfacher, da man bei komplexen Abfragen keine irritierende Verschachtelung mittels Hochkommata hat.

Infos in den Books online sowie Infos über die Benutzung der (nicht dokumentierten) Outputparameter für die Rückgabe von Ergebnissen http://support.microsoft.com/default.aspx?scid=KB;en-us;q262499

Hoffe das hilft!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...