我有一个表'Faktor'(varchar(50)),其中包含以下表达式:
1/3
2*9/5
0.567
0.23
不,我正在寻找一种方法来执行像
这样的选择select Faktor from Artikel
应该返回一个十进制类型的列,其值为
0.333333
3.6
0.567
0.23
答案 0 :(得分: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
答案 1 :(得分:3)
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
答案 2 :(得分:0)
您可以使用execute语句将字符串编译为表示的表达式的结果,或者在应用程序中计算表达式。