Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Eval() in SQL

Empfohlene Antworten

Veröffentlicht

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?

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

Mann, das hatte ich befürchtet! :(

Na gut, hätte ja sein können. Dann eben der kompliziertere Weg, danke dir.

wo ist das Problem einfach ein

DECLARE @myEval INT

SET @myEval = (3 * 6 + 15/3)

Damit klappts doch auch.. wenn du die Werte von irgendwo holst achte auf den korrekten Datentyp

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?

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.

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 ;)

Hmm, der schmeißt mir immer noch die komplette Formel raus, kein Ergebnis.

Also mein Code da oben gibt mir genau das aus:

 ERGEBNIS    

 ----------- 

 23          


 1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms] 

Ok, es funktioniert, ABER meine Formel gibt eine Kommazahl aus und keine Ganzzahl. Der rundet die Ergebnisse ab.

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)

Ich bekomm da immer nur

Error converting data type varchar to float.

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...

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:

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 ?

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

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.)

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

;)

Also: SET könnte man überall mit SELECT austauschen, aber nicht umgekehrt (z.B. wenn man Werte aus einer Tabelle holt).

SELECT @var = 1

ist äquivalent zu

SET @var = 1

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 ??

Also: SET könnte man überall mit SELECT austauschen, aber nicht umgekehrt (z.B. wenn man Werte aus einer Tabelle holt).

SELECT @var = 1

ist äquivalent zu

SET @var = 1

So in etwa denk ich mal koennte das hinkommen ;)

Dann wäre alles geklärt! Vielen Dank! :)

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

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!

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.