利用正则表达式从SQL语句取对象名
潜水很久了,今天出来冒个泡,透透气儿,最近在学习正则表达式,下面给大家讲一个应用:从SQL语句取对象名,从而分析一个函数或者是视图、存储过程依赖于哪些对象。顺便给大家推荐一下RegexBuddy。
RegexBuddy是一个不错的正则表达式编辑工具。以下是它的界面
最上面是表达式,中间是测试文本,最下方是匹配结果,每部分都会自动着色。
下面分析一下如何从一段复杂的SQL语句中分析出其依赖于哪些对象,列举一段项目中实际用到的SQL语句。


/*
函数名称:dbo.F_SBM_Add_DjDjYs(
)
函数说明:输入因素类型代码字符,统计保存因素内容
参数说明:定价方案AUTOID,因素代码,因素名称,计算方法
*/
CREATE procedure dbo.F_SBM_Add_DjDjYs
@PriceSchemAutoID int,
@YsCode varchar(100),
@YsCodeName varchar(100),
@YsJsff varchar(10)
as
begin
declare @username varchar(30)
declare @orgcode varchar(100)
declare @SchemeID varchar(50)
declare @SchemeName varchar(50)
declare @ProjectID varchar(50)
declare @maxautoid int
declare @Calc varchar(50)
declare @tstd numeric(15,3)
declare @bstd numeric(15,3)
declare @std numeric(15,3)
--取得数据
select @username=a.username,@orgcode=a.orgcode,
@SchemeID=a.SchemeID,@SchemeName=a.SchemeName,
@ProjectID=a.ProjectID,@Calc=CalculationalMethods,
@tstd=TotalStd,@bstd=BasicStd
from dbo.T_P_SBM_PriceScheme a
where a.autoid=@PriceSchemAutoID
set @std=@tstd
if (@Calc='基价标准')
begin
set @std=@bstd
end
--插入因素
select @maxautoid=Count(*)
from dbo.F_SBM_EquationList(@SchemeID,@YsCode) a
if (@maxautoid>0 )
begin
insert into dbo.T_P_SBM_EquationSelect (username, orgcode,
SchemeID, SchemeName, FactorID, FactorName,
CalculationalMethods, BasicPoint, Assessor)
select @username as username,@orgcode as orgcode,
@SchemeID as SchemeID,@SchemeName as SchemeName,
@YsCode as FactorID,@YsCodeName as FactorName,
@YsJsff as CalculationalMethods,@std as BasicPoint,
'' as Assessor
select @maxautoid=IDENT_CURRENT('T_P_SBM_EquationSelect')
--插入因素对应的因素值
insert into dbo.T_P_SBM_EquationDetail (username, orgcode,
mainid, maintbl,
SchemeID, SchemeName, FactorID, FactorName,
FactorValue,FactorValueA,FactorValueB,FactorValueC)
select @username as username,@orgcode as orgcode,
@maxautoid as mainid,'T_P_SBM_EquationSelect' as maintbl,
@SchemeID as SchemeID,@SchemeName as SchemeName,
@YsCode as FactorID, a.Orientation as FactorName,
0 as FactorValue,0 as FactorValueA,0 as FactorValueB,0 as FactorValueC
from dbo.F_SBM_EquationList(@SchemeID,@YsCode) a
end
end


GO
对象名一般位于delete、from、insert、update 之后,有时也会位于delete from 、insert into 之后,所以可以把对象名之前的部分写成
(insert\s+into|delete\s+from|from|insert|update|delete),注意把delete from 、insert into 放到前面,之后是若干个空格 ,最后就是对象名了,但是有一点
对象名也可能是db.dbo.objname 形式,所以可以把对象名称部分写成 (\w+[\w\.]+\w+),把这三部分合起来就是
(insert\s+into|delete\s+from|from|insert|update|delete)\s+(\w+[\w\.]+\w+).


浙公网安备 33010602011771号