validar una separar por parte operador numero not extraer delimitada comas charindex cadena sql-server tsql evaluate

sql-server - una - substring sql



String Expression para ser evaluado al número (5)

No creo que eso sea posible en una función definida por el usuario.

Podrías hacerlo en un procedimiento almacenado, como:

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

Pero SQL dinámico, como exec o sp_executesql , no está permitido en las funciones definidas por el usuario.

Necesito escribir una función definida por el usuario de TSQL que aceptará una cadena y devolverá un número.

Llamaré a la función como dbo.EvaluateExpression(''10*4.5*0.5'') debería devolver el número 22.5

¿Alguien puede ayudarme a escribir esta función? EvaluateExpression .

Actualmente estoy usando la función CLR, que debo evitar.

Edit1

Sé que esto se puede hacer usando el procedimiento almacenado, pero quiero llamar a esta función en algunos enunciados ex: select 10* dbo.EvaluateExpression(''10*4.5*0.5'')

También tengo alrededor de 400,000 fórmulas como esta para ser evaluadas.

Edit2

Sé que podemos hacerlo usando osql.exe dentro de la función explicada aquí . Pero debido a la configuración de permisos, no puedo usar esto también.


Use esta función, funcionará completamente.

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

Puedes usar esto

Select 10* dbo.EvaluateExpression(''10*4.5*0.5'')


Creo que deberías escribir tu propio func usando recursión. Tal vez sea útil utilizar la notación polaca inversa


Descargo de responsabilidad : soy el propietario del proyecto Eval SQL.NET en GitHub

Para SQL 2012+, puede usar Eval SQL.NET que se puede ejecutar con permiso SAFE.

El rendimiento es excelente (mejor que UDF) y respeta la precedencia y el paréntesis del operador. De hecho, casi todo el lenguaje C # es compatible.

También puede especificar un parámetro para su fórmula.

-- SELECT 225.00 SELECT 10 * CAST(SQLNET::New(''10*4.5*0.5'').Eval() AS DECIMAL(18, 2)) -- SELECT 70 DECLARE @formula VARCHAR(50) = ''a+b*c'' SELECT 10 * SQLNET::New(@formula) .Val(''a'', 1) .Val(''b'', 2) .Val(''c'', 3) .EvalInt()


Puede usar el procedimiento SQL almacenado a continuación para calcular el resultado de cualquier fórmula con cualquier cantidad de variables:

En 2012 escribí una solución que puede evaluar cualquier tipo de fórmula matemática utilizando SQL SERVER. La solución puede manejar cualquier fórmula con N variables:

Me pidieron que encontrara una manera de evaluar el valor dado por una Fórmula que llena el usuario. La Fórmula contiene operaciones matemáticas (suma, multiplicación, división y sustracciones). Los parámetros utilizados para calcular la fórmula se almacenan en el BASE DE DATOS del servidor SQL.

La solución que encontré fue la siguiente:

Supongamos que tengo n parámetros utilizados para calcular la fórmula, cada uno de estos parámetros se almacena en una fila en una tabla de datos. - La tabla de datos que contiene las n filas para usar en la fórmula se llama tab_value - Tengo que almacenar los n valores encontrados en n filas (en tab_values) en una sola fila en una nueva tabla, usando el cursor SQL, - para eso creo una nueva tabla llamada tab_formula - En el cursor, agregaré una nueva columna para cada valor, el nombre de la columna será Id1, Id2, Id3, etc. - Luego construiré un script SQL que contenga la fórmula para evaluar la fórmula

Aquí, después del guión completo, espero que lo encuentres útil, puedes preguntarlo al respecto.

El procedimiento utiliza como entrada: -La tabla de la fórmula -A que contiene los valores utilizados para calcular la fórmula

si existe (seleccione 1 de sysobjects donde name = ''usp_evaluate_formula'' y xtype = ''p'') drop proc usp_evaluate_formula go

crear tipo type_tab como tabla (id int identity (1,1), val decimal (10,2)) ir a crear proc usp_evaluate_formula (@formula como nvarchar (100), @ valores como type_tab readonly) como comenzar --KAMEL GAZZAH - [email protected] --05 / 09/2016

declarar tabla @tab_values ​​(id int, val decimal (10,2))

eliminar de @tab_values ​​insertar en @tab_values ​​(id, val) seleccionar * de @values

declarar @id como int declare @val como decimal (10,2)

si no existe (seleccione 1 de sysobjects donde name = ''tab_formula'') cree la tabla tab_formula (id int identity (1,1), formula nvarchar (1000)) si no existe (seleccione 1 de tab_formula donde formula = @ formula) inserte en valores tab_formula (fórmula) (@formula)

declarar el cursor c para seleccionar id, val de @tab_values ​​declarar @script como nvarchar (4000) abrir c buscar c en @ id, @ val while @@ fetch_status = 0 comenzar set @script = ''si no existe (seleccionar 1 de syscolumns c join interno sysobjects o en c.id = o.id donde o.name = '''' tab_formula '''' y c.name = '''' id ''+ convert (nvarchar (3), @ id) +'' '''') alter table tab_formula add id ''+ convert (nvarchar (3), @ id) +'' decimal (10,2) ''print @script exec (@script) set @ script ='' actualizar tab_formula set id ''+ convert (nvarchar (3), @ id) + ''='' + convert (nvarchar (10), @ val) + ''donde formula ='' '''' + @ formula + '''' '''' imprimir @script exec (@script) buscar c into @ id, @ val cerrar cerrar c desasignar c

set @ script = ''select *, convert (decimal (10,2),'' + @ formula + '') "Result" de tab_formula donde formula ='' '''' + @ formula + '''' '''' print @script exec (@script)

fin

ir

declarar @mytab como tipo_tab insertar en @mytab (val) valores (1.56) insertar en @mytab (val) valores (15) insertar en @mytab (val) valores (25) insertar en @mytab (val) valores (32) insertar en @mytab (val) valores (17) insertar en @mytab (val) valores (33) insertar en @mytab (val) valores (37.9)

exec usp_evaluate_formula''cos (id1) + cos (id2) + cos (id3) + cos (id4) + cos (id5) + cos (id6) + cos (id7) / cos (Id6) '', @ mytab

ir a caer proc usp_evaluate_formula drop type type_tab drop table tab_formula