我有一個具有包含了像表達式一列「FAKTOR」(VARCHAR(50))的表:轉換字符串表達式轉換爲十進制
1/3
2*9/5
0.567
0.23
不,我正在尋找一種方式來執行選擇像
select Faktor from Artikel
,應和返回值類型小數的列
0.333333
3.6
0.567
0.23
我有一個具有包含了像表達式一列「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答案的優勢)不會):
編輯:源代碼對於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
編輯:OK,我剛纔測試了這一點,它在基於集合的操作等工作正常,安裝如下:
-- 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
您可以使用ST執行atment將字符串編譯爲表示的表達式的結果,或者在應用程序中評估表達式。
你能不能給我一個樣品是如何做到這一點? – BennoDual 2012-04-23 09:49:51
太糟糕了。 在表達式中,所有數字都是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('[email protected]+'.0 as decimal(5,2))'
EXECUTE(@query)
END CATCH
非常感謝您的樣品。我已經成功完成了所有步驟。但是,當我嘗試執行SQL選擇時,我得到了下面的例外: System.IO.FileLoadException:模塊Datei或程序集「pp.sqlserver.library,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null」oder eineAbhängigkeitdavon wurde nicht gefunden。 Dergegebebe Assemblyname或者Codebasis istungültig。 (Ausnahme von HRESULT:0x80131047) System.IO.FileLoadException – BennoDual 2012-04-23 12:04:59
我的德語不是很好,但它聽起來像裝配不能找到?你確定你安裝了正確的數據庫嗎? – HeavenCore 2012-04-23 12:08:16
是的 - 我已經使用了你的查詢 - 我在開頭添加了'使用[PPSystem_DOS]'。在使用Management Studio查看時,Assembly會列在正確的數據庫中。我問我,爲什麼它沒有在異常中顯示版本信息(而不是0.0.0.0) - 我的程序集有一個版本。 – BennoDual 2012-04-23 12:54:53