sql >> Database >  >> RDS >> Sqlserver

Converteer tekenreeks met uitdrukking naar decimaal

Ik zou voor een CLR gaan, zoiets als dit (dit heeft het voordeel dat het werkt in op SET gebaseerde bewerkingen, terwijl de dynamische sql-alternatieven (d.w.z. Abduls antwoord) dat niet zullen doen):

BEWERKEN: Broncode voor de CLR dll (Visual Studio 2008) die hier is gepost:http:/ /www.heavencore.co.uk/filehub/uploaded/EvalFunction.zip

Als je de assembly liever zelf wilt compileren, is hier de code:

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

eenmaal geïnstalleerd en gebonden kunt u dit doen:

SELECT Faktor, dbo.Eval(Faktor) as Result FROM Artikel

Bewerken:OK, ik heb dit zojuist getest en het werkt prima in set-gebaseerde bewerkingen enz. De installatie was als volgt:

-- 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. Hoe unicode op te slaan in MySQL?

  2. een telling voor elke join - optimalisatie

  3. PHP-code om een ​​MySQL-query naar CSV te converteren

  4. Tabeltype-object doorgeven als invoerparameter naar Stored Procedure in Oracle vanuit C#