7

文字列を受け入れて数値を返すTSQLユーザー定義関数を作成する必要があります。

dbo.EvaluateExpression('10*4.5*0.5')番号を返すように関数を呼び出します22.5

誰かが私がこの関数を書くのを手伝ってくれますかEvaluateExpression

現在、回避する必要のあるCLR関数を使用しています。

編集1

これはストアドプロシージャを使用して実行できることはわかっていますが、いくつかのステートメントでこの関数を呼び出したいと思います。select 10* dbo.EvaluateExpression('10*4.5*0.5')

また、私はこのような約40万の数式を評価する必要があります。

Edit2

ここで説明するように、関数内でosql.exeを使用して実行できることはわかっています。ただし、権限設定のため、これも使用できません。

4

4 に答える 4

6

ユーザー定義関数ではそれが可能だとは思いません。

次のようなストアド プロシージャで実行できます。

declare @calc varchar(max)
set @calc = '10*4.5*0.5'

declare @sql nvarchar(max)
declare @result float
set @sql = N'set @result = ' + @calc
exec sp_executesql @sql, N'@result float output', @result out
select @result

execただし、またはのような動的 SQL はsp_executesql、ユーザー定義関数では使用できません。

于 2012-03-24T10:21:03.110 に答える
0

この関数を使用すると、絶対に機能します。

CREATE FUNCTION dbo.EvaluateExpression(@list nvarchar(MAX))

RETURNS Decimal(10,2)
AS

BEGIN
Declare @Result Decimal(10,2)
set @Result=1
 DECLARE @pos        int,
       @nextpos    int,
       @valuelen   int

SELECT @pos = 0, @nextpos = 1


WHILE @nextpos > 0
  BEGIN
     SELECT @nextpos = charindex('*', @list, @pos + 1)
     SELECT @valuelen = CASE WHEN @nextpos > 0
                             THEN @nextpos
                             ELSE len(@list) + 1
                        END - @pos - 1

                        Set @Result=@Result*convert(decimal(10,2),substring(@list, @pos + 1, @valuelen))


     SELECT @pos = @nextpos
  END

RETURN @Result
END

あなたはこれを使うことができます

Select 10* dbo.EvaluateExpression('10*4.5*0.5')
于 2012-03-24T11:06:20.333 に答える