Murcks Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 Mann, das hatte ich befürchtet! Na gut, hätte ja sein können. Dann eben der kompliziertere Weg, danke dir. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 Ja aber der String mit der Formel (strFormel) kommt ja aus einem Programm Hast du Einfluss auf dieses "Programm"? Welches Programm gibt überhaupt SQL-Strings aus? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 Hmm, der schmeißt mir immer noch die komplette Formel raus, kein Ergebnis. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 Also mein Code da oben gibt mir genau das aus: ERGEBNIS ----------- 23 1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 Ok, es funktioniert, ABER meine Formel gibt eine Kommazahl aus und keine Ganzzahl. Der rundet die Ergebnisse ab. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 26. Juli 2006 Autor Teilen Geschrieben 26. Juli 2006 Ich bekomm da immer nur Error converting data type varchar to float. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 26. Juli 2006 Teilen Geschrieben 26. Juli 2006 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 27. Juli 2006 Autor Teilen Geschrieben 27. Juli 2006 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 28. Juli 2006 Teilen Geschrieben 28. Juli 2006 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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 28. Juli 2006 Teilen Geschrieben 28. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 28. Juli 2006 Autor Teilen Geschrieben 28. Juli 2006 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! (Kleine Frage noch am Rande: Was genau ist der Unterschied zwischen SET und SELECT? Möchte jetzt keinen neuen Thread dafür aufmachen.) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 28. Juli 2006 Teilen Geschrieben 28. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 28. Juli 2006 Autor Teilen Geschrieben 28. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigpoint Geschrieben 28. Juli 2006 Teilen Geschrieben 28. Juli 2006 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 ?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 28. Juli 2006 Teilen Geschrieben 28. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Murcks Geschrieben 28. Juli 2006 Autor Teilen Geschrieben 28. Juli 2006 Dann wäre alles geklärt! Vielen Dank! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 28. Juli 2006 Teilen Geschrieben 28. Juli 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tafkame Geschrieben 4. August 2006 Teilen Geschrieben 4. August 2006 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.