Convert string with expression to decimal

后端 未结 3 483
清歌不尽
清歌不尽 2021-01-06 16:33

I have a table which has a column \'Faktor\' (varchar(50)) which contains expressions like:

1/3
2*9/5
0.567
0.23

No, I am searching a way t

相关标签:
3条回答
  • 2021-01-06 16:52

    You could use the execute statment to compile the string to the result of the represented expression or you evaluate the expression in your application.

    0 讨论(0)
  • 2021-01-06 16:58

    I'd go with a CLR, something like this (this has the advantage of working in SET based operations whereas the dynamic sql alternatives (i.e. Abduls answer) will not):

    EDIT: Source Code for the CLR dll (Visual Studio 2008) posted here: http://www.heavencore.co.uk/filehub/uploaded/EvalFunction.zip

    If you would prefer to compile the assembly yourself, here is the code:

    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.SqlTypes
    Imports Microsoft.SqlServer.Server
    Imports System.Runtime.InteropServices    
    
    Partial Public Class UserDefinedFunctions
        <Microsoft.SqlServer.Server.SqlFunction()> _
        Public Shared Function EVAL(ByVal InputExpression As SqlString) As SqlDecimal
            Return Evaluate(InputExpression)
        End Function
    
        Private Shared Function Evaluate(ByVal expression As SqlString) As SqlDecimal
            Dim expressionStr As String = expression.ToString()
            Dim loDataTable = New DataTable()
            Dim loDataColumn = New DataColumn("Eval", GetType(Double), expressionStr)
            loDataTable.Columns.Add(loDataColumn)
            loDataTable.Rows.Add(0)
            Return ParseDecimal(loDataTable.Rows(0)("Eval").ToString(), 0)
        End Function
    
        Public Shared Function ParseDecimal(ByVal InputStr As String, Optional ByVal ReturnIfFail As Decimal = 0) As Decimal
            Dim ParseOutput As Decimal = 0
            If Decimal.TryParse(InputStr, ParseOutput) = False Then
                Return ReturnIfFail
            Else
                Return ParseOutput
            End If
        End Function
    End Class
    

    once installed and bound you could then do this:

    SELECT Faktor, dbo.Eval(Faktor) as Result FROM Artikel
    

    Edit: OK, i have just tested this and it works fine in set-based operations etc, installation was as follows:

    -- Enable the CLR to run user-defined functions
    EXEC sp_configure 
        'clr enabled' ,
        '1'
    GO
    RECONFIGURE
    GO
    
    -- Set the appropriate database security permission
    ALTER DATABASE [TargetDatabase] SET TRUSTWORTHY ON
    GO
    
    -- Import the assembly
    CREATE ASSEMBLY EvalFunction
    FROM 'C:\bin\EvalFunction.dll'  
    WITH PERMISSION_SET = EXTERNAL_ACCESS;
    GO
    
    -- Create the Eval function for easy use
    CREATE FUNCTION dbo.Eval
        (
          @Expression NVARCHAR(255)
        )
    RETURNS DECIMAL(18, 2)
    AS EXTERNAL NAME 
        EvalFunction.[EvalFunction.UserDefinedFunctions].EVAL 
    GO
    
    0 讨论(0)
  • 2021-01-06 17:02

    too bad. In the expression all numbers are int datatype. So, its difficult to calculate and show the result in decimal.

    Here is a sample, hope it will help-

    declare @expr nvarchar(10)
    set @expr='2*9/5'
    declare @query varchar(800)
    
    BEGIN TRY
        SELECT CAST(@expr as decimal(5,2))
    END TRY
    BEGIN CATCH
        SET @query='SELECT CAST('+@expr+'.0 as decimal(5,2))'
        EXECUTE(@query)
    END CATCH
    
    0 讨论(0)
提交回复
热议问题