将带有表达式的字符串转换为十进制

2023-12-06

我有一个表,其中有一列“Faktor”(varchar(50)),其中包含以下表达式:

1/3
2*9/5
0.567
0.23

不,我正在寻找一种执行选择的方法,例如

select Faktor from Artikel

它应该返回带有值的十进制类型的列

0.333333
3.6
0.567
0.23

我会使用 CLR,类似这样的东西(这具有在基于 SET 的操作中工作的优点,而动态 sql 替代方案(即 Abduls 答案)不会):

EDIT:CLR dll (Visual Studio 2008) 的源代码发布在此处:http://www.heavencore.co.uk/filehub/uploaded/EvalFunction.zip

如果您想自己编译程序集,代码如下:

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

安装并绑定后,您可以执行以下操作:

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

编辑:好的,我刚刚测试过这个,它在基于集合的操作等中工作正常,安装如下:

-- 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将带有表达式的字符串转换为十进制 的相关文章

随机推荐