拆分公式函数及应用
2012-06-28 15:41
155 查看
/*
功能: 拆分公式函数
示例: select * from F_Hr_SplitFormula('a=[X] and b=[Y]') order by ID
历史:
2012-06-28 Chelen 创建
*/
create function F_Hr_SplitFormula
(
@Formula nvarchar(4000)
)
returns
@T table
(
ID int identity(1,1),
Param nvarchar(4000)
)
as
begin
declare @Posit int = 0
while CHARINDEX('[', @Formula) > 0 and CHARINDEX(']', @Formula) > 0
begin
set @Posit = CHARINDEX('[', @Formula)
insert into @T(Param) values (Substring(@Formula, 1, @Posit -1)) -- 将"["前的字符串插入到临明表
set @Formula = SUBSTRING(@Formula, @Posit, LEN(@Formula)) -- 截断"["前的字符串
--
select @Posit = CHARINDEX(']', @Formula)
if @Posit <> 0
begin
insert into @T(Param) values (Substring(@Formula, 1, @Posit)) -- 将"["和"]"间字符串(即参数)插入到临明表
set @Formula = SUBSTRING(@Formula, @Posit + 1, LEN(@Formula)) -- 截断"]"前的字符串
end
end
if @Formula <> ''
begin
insert into @T(Param) values (@Formula) --将剩余的字符串插入到临明表
end
return
end
【示例】
if OBJECT_ID('Tempdb..#Param') is not null
drop table #Param
create table #Param(ID int identity(1,1), ParamName nvarchar(50), ParamValue nvarchar(50))
insert into #Param(ParamName, ParamValue) values('语文', '80' )
insert into #Param(ParamName, ParamValue) values('数学', '95' )
insert into #Param(ParamName, ParamValue) values('英语', '90' )
declare @Formula nvarchar(4000) = '(case when [语文]+[数学]+[英语] > 270 then ''优'' when [语文]+[数学]+[英语]<180 then ''不合格'' else ''合格'' end)'
--拆分后的数据集
select * from F_Hr_SplitFormula(@Formula) f order by f.ID
select @Formula = (case when f.ID=1 then '' else @Formula end) + (case when p.ParamValue is not null then p.ParamValue else f.Param end)
from F_Hr_SplitFormula(@Formula) f
left join #Param p on '[' + p.ParamName + ']' = f.Param
order by f.ID
-- 替换后结果
select @Formula
-- 执行结果
Execute('Select ' + @Formula)
drop table #Param
功能: 拆分公式函数
示例: select * from F_Hr_SplitFormula('a=[X] and b=[Y]') order by ID
历史:
2012-06-28 Chelen 创建
*/
create function F_Hr_SplitFormula
(
@Formula nvarchar(4000)
)
returns
@T table
(
ID int identity(1,1),
Param nvarchar(4000)
)
as
begin
declare @Posit int = 0
while CHARINDEX('[', @Formula) > 0 and CHARINDEX(']', @Formula) > 0
begin
set @Posit = CHARINDEX('[', @Formula)
insert into @T(Param) values (Substring(@Formula, 1, @Posit -1)) -- 将"["前的字符串插入到临明表
set @Formula = SUBSTRING(@Formula, @Posit, LEN(@Formula)) -- 截断"["前的字符串
--
select @Posit = CHARINDEX(']', @Formula)
if @Posit <> 0
begin
insert into @T(Param) values (Substring(@Formula, 1, @Posit)) -- 将"["和"]"间字符串(即参数)插入到临明表
set @Formula = SUBSTRING(@Formula, @Posit + 1, LEN(@Formula)) -- 截断"]"前的字符串
end
end
if @Formula <> ''
begin
insert into @T(Param) values (@Formula) --将剩余的字符串插入到临明表
end
return
end
【示例】
if OBJECT_ID('Tempdb..#Param') is not null
drop table #Param
create table #Param(ID int identity(1,1), ParamName nvarchar(50), ParamValue nvarchar(50))
insert into #Param(ParamName, ParamValue) values('语文', '80' )
insert into #Param(ParamName, ParamValue) values('数学', '95' )
insert into #Param(ParamName, ParamValue) values('英语', '90' )
declare @Formula nvarchar(4000) = '(case when [语文]+[数学]+[英语] > 270 then ''优'' when [语文]+[数学]+[英语]<180 then ''不合格'' else ''合格'' end)'
--拆分后的数据集
select * from F_Hr_SplitFormula(@Formula) f order by f.ID
select @Formula = (case when f.ID=1 then '' else @Formula end) + (case when p.ParamValue is not null then p.ParamValue else f.Param end)
from F_Hr_SplitFormula(@Formula) f
left join #Param p on '[' + p.ParamName + ']' = f.Param
order by f.ID
-- 替换后结果
select @Formula
-- 执行结果
Execute('Select ' + @Formula)
drop table #Param
相关文章推荐
- Excel -- 2. 公式与函数应用
- 【来日复制粘贴】用高级筛选和函数公式拆分数据列表
- 字符串分割函数应用-拆分成多行
- SQL Server 函数学习笔记⑥函数的高级应用=》按规则拆分列形成行数据
- 中文版Excel 2007公式与函数应用宝典
- DB2中有关日期和时间的函数,及应用
- php中的注释、变量、数组、常量、函数应用介绍
- python max()函数的应用
- php中的current prev next end reset函数的应用
- JQuery入门――用bind方法绑定事件处理函数应用介绍
- C语言中函数调用中静态变量的应用
- GetCurrentDirectory等文件夹操作函数 && MessageBox信息函数 && VC应用执行DOS命令和批处理
- js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
- prctl()函数应用
- DB2 日期和时间的函数应用总结
- 简单Case函数应用
- 疯狂输出⚔ Java中函数中定义及应用
- 函数模板的应用。
- class_create()函数应用
- substr 截取函数的应用