转换字符串表达式转换为十进制(Convert string with expression to d

2019-06-23 21:19发布

我有具有包含像表达式列“FAKTOR”(VARCHAR(50))的表:

1/3
2*9/5
0.567
0.23

不,我正在寻找一种方式来执行选择像

select Faktor from Artikel

其应返回型小数的与值的列

0.333333
3.6
0.567
0.23

Answer 1:

我会用CLR,像这样的东西去(这在基于SET操作,而动态SQL替代工作(即Abduls答案的优势)不会):

编辑:源代码,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


Answer 2:

太糟糕了。 在表达式中的所有数字是int数据类型。 因此,其很难计算和显示结果的decimal

下面是一个示例,希望这将帮助 -

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


Answer 3:

您可以使用执行statment编译字符串为代表的表达式的结果,或者你评估你的应用程序中的表达。



文章来源: Convert string with expression to decimal