PROCEDURE parse_sqlstring LPARAMETERS sql_string sql_string=UPPER(sql_string) *sql_string=compress_blank(sql_string) *判斷使用的指令是insert,delete,update,select 的那一個 is_insert=ATC("insert",sql_string) is_delete=ATC("delete",sql_string) is_update=ATC("update",sql_string) is_select=ATC("select",sql_string) i=1 *建立分隔號在字串中位置的陣列,包含了空格、左括號"("、右括號")"、逗點","、等號=,>,<,<>,>=,<= sep_string=" ,()<>=" array_len=0 FOR j=1 TO LEN(sep_string) sep_element=SUBSTR(sep_string,j,1) i=1 DO WHILE ATC(sep_element,sql_string,i)>0 array_len=array_len+1 DIMENSION sep[array_len] sep[array_len]=ATC(sep_element,sql_string,i) i=i+1 ENDDO ENDFOR *排序(由小而大) =ASORT(sep) *根據分符號來分割字串建立字串陣列,分割符號也要放在陣列中 *i=1 的字串必定存在,去掉空白的陣列元素 FOR i =1 TO ALEN(sep) IF i=1 DIMENSION m_array[1] t_string=SUBSTR(sql_string,1,sep[i]-1) m_array[1]=t_string t_string=ALLT(SUBSTR(sql_string,sep[i],1)) IF !EMPTY(t_string) DIMENSION m_array[2] m_array[2]=t_string ENDIF ELSE t_string=ALLT(SUBSTR(sql_string,sep[i-1]+1,sep[i]-sep[i-1]-1)) IF !EMPTY(t_string) array_len=ALEN(m_array)+1 DIMENSION m_array[array_len] m_array[array_len]=t_string ENDIF t_string=ALLT(SUBSTR(sql_string,sep[i],1)) IF !EMPTY(t_string) array_len=ALEN(m_array)+1 DIMENSION m_array[array_len] m_array[array_len]=t_string ENDIF ENDIF ENDFOR sep_len=ALEN(sep) IF sep[sep_len]0 IF ASCAN(m_array,"INTO")>0 table_position=ASCAN(m_array,"INTO")+1 table_name=m_array[table_position] ENDIF CASE is_delete>0 IF ASCAN(m_array,"FROM")>0 table_position= ASCAN(m_array,"FROM")+1 table_name=m_array[table_position] ENDIF CASE is_update>0 IF ASCAN(m_array,"UPDATE")>0 table_position= ASCAN(m_array,"UPDATE")+1 table_name=m_array[table_position] ENDIF CASE is_select>0 IF ASCAN(m_array,"FROM")>0 table_position=ASCAN(m_array,"FROM")+1 table_name=m_array[table_position] ENDIF OTHERWISE ENDCASE IF SUBSTR(ALLTRIM(table_name),1,2)="M." m_array[table_position]=&table_name ENDIF *尋找其它的變數取代之 i=1 FOR EACH element IN m_array IF LEFT(element ,2)=="M." IF TYPE("&element")=="C" m_array[i]="'"+&element+"'" ELSE m_array[i]=&element ENDIF ENDIF i=i+1 ENDFOR *針對數字部份,如果非有小數點去掉小數點及以下 return_string ="" FOR i=1 TO ALEN(m_array) IF !EMPTY(m_array[i]) IF TYPE("m_array[i]")=="N" t_value=ALLTRIM(STR(m_array[i],20,5)) DO WHILE INLIST(RIGHT(t_value,1),"0" ,".") t_value=SUBSTR(t_value,1,LEN(t_value)-1) ENDDO return_string=return_string+" "+t_value ELSE *判別>=,<=,<>的狀況 IF INLIST(RIGHT(return_string,1),">","<") AND INLIST(m_array[i],"=",">") return_string=return_string+m_array[i] ELSE return_string=return_string+" "+m_array[i] ENDIF ENDIF ENDIF ENDFOR return_string=ALLTRIM(return_string) RETURN return_string ENDPROC