UDF para evaluar una condición usando la instrucción select

Aquí hay un requisito de función UDF:

CREATE FUNCTION [dbo].[ConditionEvaluation]

(@condEquation VARCHAR(MAX),
@condParameters VARCHAR(MAX
)
RETURNS bit
AS

Los valores de @condEquation y @condParameters están

  • Ejemplo 1: @condEquation = (C01 & C02) y @condParameters =10
  • Ejemplo 2: @condEquation = ((C01 & C02) | C3) y @condParameters =101

por lo que para cada condición de la serie C en @condEquation habrá valores 0 o 1 correspondientes en el segundo parámetro, es decir @condParameters.

Quiero evaluar la condición anterior como...

  • Ejemplo 1: select (1 & 0)
  • Ejemplo 2: select ((1 & 0) | 0)

Parámetro @condEquation puede contener cualquier número de C en la ecuación. Pero habrá un número correspondiente de bits en el parámetro2.

Estoy utilizando la capacidad de evaluación de condiciones de la instrucción SQL Select aquí y quiero devolver el resultado evaluado como 0 o 1.

¿Cómo hacer eso usando un UDF?

preguntado el 31 de julio de 12 a las 14:07

2 Respuestas

Para lograr esto, tuve que hacer 2 funciones:

create function [dbo].[f_test1](@CondEquation varchar(50))
returns bit
as
begin
declare @result bit
;with a as
(
select replace(replace(replace(@CondEquation, '(',''), ')',''), ' ','') n
),
b as
(
select n, 1 rn from a
union all
select stuff(n, patindex('%&%', n) - 1, 3 , case when substring(n, patindex('%&%', n) - 1, 3) like '%0%' then 0 else 1 end), rn+1
from b
where patindex('%&%', n)> 0
), c as
(
select n from (
select n, row_number() over (order by rn desc) rn2 from b
) a where rn2 = 1
), d as
(
select n, 1 rn from c
union all
select stuff(n, patindex('%|%', n) - 1, 3 , case when substring(n, patindex('%|%', n) - 1, 3) like '%1%' then 1 else 0 end), rn+1
from d
where patindex('%|%', n)> 0
), e as
(
select n from (
select n, row_number() over (order by rn desc) rn2 from d
) a where rn2 = 1
)
select @result=n from e
return @result
end
go

create function [dbo].[f_test2](@CondEquation varchar(max), @condparameters varchar(max))
returns bit
as
begin
declare @result bit

declare @i int = 1
while @i <= len(@condparameters)
begin
set @CondEquation = replace(@CondEquation, 'c' + right(@i+100, 2), substring(@condparameters, @i, 1))
set @i += 1
end

declare @returnvalue bit
;with a as
(
select @CondEquation a, 1 rn
union all
select stuff(a.a, z.a-z.b+1, z.b+1,[dbo].[f_test1](substring(a.a, z.a-z.b+1, z.b+1)) ), rn+1  from
a cross apply(
select patindex('%_)%', a.a) a, charindex('(', reverse(left(a.a, patindex('%_)%', a.a)))) b
where a.a like '%)%'
) z
), b as
(
select a, row_number() over (order by rn desc) rn from a
)
select @returnvalue = [dbo].[f_test1](a) from b where rn = 1

return @returnvalue
end
go

Puedes probar la función con esto como

select dbo.[f_test2]('((C01 & C02) | C03)', '110')

Tenga en cuenta que es importante que utilice el formato correcto de los parámetros. No puedes escribir C3 en lugar de C03. Le sugiero que regrese y evalúe sus viejas preguntas para obtener respuestas correctas.

Respondido 31 Jul 12, 17:07

    CREATE FUNCTION [dbo].[ConditionEvaluation] 

(@condEquation VARCHAR(MAX), 
@condParameters VARCHAR(MAX) 
) 
RETURNS bit 
AS 
BEGIN

declare @len int=len(@condParameters)
declare @val varchar(100)
declare @i int=1
declare @Sindex int=0
declare @op bit
set @condEquation=replace(replace(@condEquation,' ',','),')',',)')

while(@i<=@len )
begin
set @val=SUBSTRING (@condParameters,@i,1)
set @Sindex =CHARINDEX ('C',@condEquation)
set @condEquation=stuff(@condEquation,@Sindex ,charindex(',',@condEquation)-2 ,@val)
set @i=@i+1
end

set @condEquation= 'select @OP1'+replace(@condEquation,',','')+' as output1'


execute sp_executesql @condEquation,N'@OP1 int OUTPUT',@OP1=@OP OUTPUT

return @OP

END

Respondido 31 Jul 12, 18:07

La razón por la que mi secuencia de comandos es tan complicada es que ejecutar una secuencia de comandos dentro de una función es imposible, por lo que imagino que su secuencia de comandos no se puede ejecutar: t-clausen.dk

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.