Convert string with expression to decimal

后端 未结 3 499
清歌不尽
清歌不尽 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: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
         _
        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
    

提交回复
热议问题