利用正则表达式从SQL语句取对象名

潜水很久了,今天出来冒个泡,透透气儿,最近在学习正则表达式,下面给大家讲一个应用:从SQL语句取对象名,从而分析一个函数或者是视图、存储过程依赖于哪些对象。顺便给大家推荐一下RegexBuddy。
RegexBuddy是一个不错的正则表达式编辑工具。以下是它的界面

SpxImage.jpg

最上面是表达式,中间是测试文本,最下方是匹配结果,每部分都会自动着色。
下面分析一下如何从一段复杂的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+).

posted @ 2007-07-11 22:21  黑马  阅读(1728)  评论(0)    收藏  举报