发信人: finlove (荒野之狼), 信区: BorlandDev
标  题: 将一个Sqlwhere条件 子句插入到一个已有的SQL语句中
发信站: 哈工大紫丁香 (Tue Jan 22 13:03:10 2002) , 转信

//功能:将一个Where 子句插入到一个SQL语句中,并且按照And关系重新组合。
//参数:Str_OldSQL:源SQL语句Str_Filter:Where 子句(不能带where);返回组合后的SQ
L语句



function CR_AddFilterTOSQL(const Str_OldSQL,Str_Filter: string): string;
var

  Str_OldSQLCopy,str_lowerOldSQL, str_newFilter ,str_child1,str_child2:string;

  int_WherePos,int_OderByPos,int_GroupByPos,
  int_BreakPos,int_BreakPos2,int_length:integer;
begin
    if Str_Filter='' then
    begin
       Result:=Str_OldSQL;
       Exit;
    end;
    Str_OldSQLCopy:=Str_OldSQL;
    int_length:=length(Str_OldSQL);
    str_lowerOldSQL:=AnsiLowerCase(Str_OldSQL); //将所有字母转为小写
         //查找 where ,order,group子句的位置
    int_WherePos:=Pos(' where ',str_lowerOldSQL);
    int_OderByPos:=Pos(' order ',str_lowerOldSQL);
    int_GroupByPos:=pos(' group ',str_lowerOldSQL);
        //如果不存在相应的关键词,则把其形对应的位置置为字符串长度 +1
    if int_WherePos=0 then int_WherePos:=int_length+1;
    if int_OderByPos=0 then int_OderByPos:=int_length+1;
    if int_GroupByPos=0 then int_GroupByPos:=int_length+1;
       //找出最靠前的关键词
    int_BreakPos:=min(int_WherePos,int_OderByPos);
    int_BreakPos:=min(int_BreakPos,int_GroupByPos);

    if int_WherePos=int_length+1 then  //如果不存在where 关键词则处理 被插入的
过滤条件
       str_newFilter:=' where '+Str_Filter
    else
    begin  //如果存在where 子句则将where 则:。。。。
       str_newFilter:=Str_Filter+' and (';
       if (int_GroupByPos>=int_BreakPos) and (int_GroupByPos<=int_OderByPos) t
hen
           int_BreakPos2:=int_GroupByPos
       else
           int_BreakPos2:=int_OderByPos;
       //上面的两个if 语句找出离where最近的关键字的位置,如果不存在其他关键字,
则为字符串的长度+1
       int_BreakPos:=int_BreakPos+7; //更改有where之后的拆分位置
       CR_BreakStrWithPos(Str_OldSQLCopy,str_child1,str_child2,int_BreakPos2);

       Str_OldSQLCopy:=str_child1+')'+str_child2; //在距where最近的关键词处,将
字符串拆分,以便为原来的where 子句加上右括号
    end;

    CR_BreakStrWithPos(Str_OldSQLCopy,str_child1,str_child2,int_BreakPos); //插

    result:=str_child1+str_newFilter+str_child2;
end;

//功能:将字符串在制定的分割位置分成两个子串
//参数:Str_Source: 源字符串 Str_Child1:前半串(不包括分割位置的字符) Str_Chil
d2:后半串(包括分割位置的字符)  int_Pos: 分隔位置

procedure CR_BreakStrWithPos(const Str_Source: string;
  var Str_Child1, Str_Child2: string; int_Pos: integer);
begin
  Str_Child1:=copy(Str_Source,1,int_Pos -1);
  Str_Child2:=copy(Str_Source,int_pos,length(Str_Source) - int_pos + 1);
end;

--

※ 来源:.哈工大紫丁香 http://bbs.hit.edu.cn [FROM: 211.97.214.52]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.006毫秒