发信人: 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毫秒