2012-04-23 43 views
3

我有一個具有包含了像表達式一列「FAKTOR」(VARCHAR(50))的表:轉換字符串表達式轉換爲十進制

1/3 
2*9/5 
0.567 
0.23 

不,我正在尋找一種方式來執行選擇像

select Faktor from Artikel 

,應和返回值類型小數的列

0.333333 
3.6 
0.567 
0.23 

回答

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 

編輯: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 
+0

非常感謝您的樣品。我已經成功完成了所有步驟。但是,當我嘗試執行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

+0

我的德語不是很好,但它聽起來像裝配不能找到?你確定你安裝了正確的數據庫嗎? – HeavenCore 2012-04-23 12:08:16

+0

是的 - 我已經使用了你的查詢 - 我在開頭添加了'使用[PPSystem_DOS]'。在使用Management Studio查看時,Assembly會列在正確的數據庫中。我問我,爲什麼它沒有在異常中顯示版本信息(而不是0.0.0.0) - 我的程序集有一個版本。 – BennoDual 2012-04-23 12:54:53

0

您可以使用ST執行atment將字符串編譯爲表示的表達式的結果,或者在應用程序中評估表達式。

+0

你能不能給我一個樣品是如何做到這一點? – BennoDual 2012-04-23 09:49:51

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('[email protected]+'.0 as decimal(5,2))' 
    EXECUTE(@query) 
END CATCH 
相關問題