Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразуване на низ с израз в десетичен

Бих избрал 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL Как да предоставите роля на потребителя

  2. Как да изпращате имейли от SQL Server (T-SQL)

  3. Не може да се свърже със SQL Server с PHP

  4. EF4.1:Възможно ли е да има връзка нула или едно към нула или едно (0..1 към 0..1)?

  5. Потребителска група на Charlotte SQL Server:Коригиране на бавни заявки. Бърз.