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

3

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

1/3
2*9/5
0.567
0.23

不,我正在寻找一种类似select的执行方式。
select Faktor from Artikel

应该返回一个类型为小数的列,其值为:
0.333333
3.6
0.567
0.23
3个回答

4

我会选择一个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

非常感谢您提供的示例。我已经成功地完成了您所有的步骤。但是当我尝试执行SQL-Select时,我遇到了以下异常: System.IO.FileLoadException:找不到文件或程序集“pp.sqlserver.library,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项。指定的程序集名称或代码库无效。(HRESULT的异常:0x80131047)。 System.IO.FileLoadException - BennoDual
我的德语不是很好,但听起来好像找不到汇编程序?你确定已经安装在正确的数据库中了吗? - HeavenCore
是的 - 我已经使用了您的查询 - 我在开头添加了'use [PPSystem_DOS]'。当我使用管理工具查看时,程序集在正确的数据库中列出。我想知道为什么异常中没有显示版本信息(而是0.0.0.0)-我的程序集有一个版本号。 - BennoDual
只是出于好奇,如果您使用我的预编译DLL并将其安装为EvalFunction。[EvalFunction.UserDefinedFunctions]。EVAL而不是PPSystem_DOS - 是否会出现相同的错误? - HeavenCore

2
今日免费次数已满, 请开通会员/明日再来
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
您可以使用“执行”语句将字符串编译为所表示表达式的结果,或在应用程序中评估该表达式。

你能给我一个示例来演示如何做到这一点吗? - BennoDual

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接