Sql server 使用select语句计算条件的UDF
以下是UDF功能要求:Sql server 使用select语句计算条件的UDF,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,以下是UDF功能要求: CREATE FUNCTION [dbo].[ConditionEvaluation] (@condEquation VARCHAR(MAX), @condParameters VARCHAR(MAX ) RETURNS bit AS @condEquation和@condParameters的值为 示例1:@condEquation=(C01和C02)和@condParameters=10 示例2:@condEquation=((C01&C02)| C3)和@co
CREATE FUNCTION [dbo].[ConditionEvaluation]
(@condEquation VARCHAR(MAX),
@condParameters VARCHAR(MAX
)
RETURNS bit
AS
@condEquation
和@condParameters
的值为
- 示例1:
和@condEquation=(C01和C02)
@condParameters=10
- 示例2:
和@condEquation=((C01&C02)| C3)
@condParameters=101
@condenquation
中的每个C系列条件,将在第二个参数中提供相应的0或1个值,即@condenparameters
我想将上述情况评估为
- 示例1:
选择(1和0)
- 示例2:
select((1&0)| 0)
@condenquation
可能包含方程式中任意数量的Cs。但是参数2中会有相应数量的位
我在这里使用SQL Select语句的条件求值功能,并希望将求值结果返回为0或1
如何使用UDF实现这一点?为了实现这一点,我必须使用两个函数:
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
请注意,使用正确的参数格式非常重要。不能用C3代替C03。我建议您返回并评估旧问题以获得正确答案。创建函数[dbo].[ConditionEvaluation]
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
(@condEquation VARCHAR(最大值),
@condParameters VARCHAR(最大值)
)
返回位
作为
开始
声明@len int=len(@condParameters)
声明@val varchar(100)
声明@i int=1
声明@Sindex int=0
声明@op位
设置@condEquation=replace(replace(@condEquation,,,,,),,,,),,,,))
而(@iReason)为什么我的脚本如此复杂是因为在函数中执行脚本是不可能的,所以我认为您的脚本无法执行
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