SQLisSelect为判断SQL语句是否为Select语句的函数,对ADO的判断基本是正确的,但使用FireDac时,有时会判断错误,请帮忙检查一下哪里出问题了,谢谢
function SQLisSelect(str:string):Boolean;
var
s,s1,s2,ss:string;
n:Integer;
begin
s:=Trim(StringReplace(str,#13,' ',[]));
s:=Trim(StringReplace(s,#10,' ',[]));
s:=Trim(StringReplace(s,'(',' ',[]));
s:=Trim(StringReplace(s,')',' ',[]));
s:=Trim(LowerCase(s));
n:=Pos('select',s);
if n=0 then s2:=''
else
begin
s2:=Trim(Copy(s,n+6,1));
s:=Trim(Copy(s,n+6,High(Integer)));
end;
Result:=(n=1) and (s2='');
if Result then
begin
ss:=s;
s:='';
Repeat //剔除由引号括起的字符串,以防字符串中有单独的"Into"而影响判断
n:=Pos('''',ss);
if n=0 then s:=s+' '+ss
else
begin
s:=s+' '+Copy(ss,1,n-1);
ss:=Copy(ss,n+1,High(Integer));
n:=Pos('''',ss);
if n>0 then
begin
ss:=Copy(ss,n+1,High(Integer));
end;
end;
Until n=0;
Repeat //检查是否有单独的"Into"关键字,有则为非Select语句
n:=Pos('into',s);
if n>0 then
begin
s1:=Trim(Copy(s,n-1,1));
s2:=Trim(Copy(s,n+4,1));
if (s1='') and (s2='') then
begin
Result:=false;
break;
end
else
begin
s:=Trim(Copy(s,n+4,High(Integer)));
end;
end;
Until n=0;
end;
end;