结合asp和存储过程做的搜索程序
2018-09-06 11:16
  比较复杂,可以支持多种逻辑符,包括+-andor空格等,并且根据需要随便增加。可以根据条件选择在那个表中搜索,对速度也做了优化,可以说是很快的。当然因为是以前写的,存在不少毛病。存储过程中用到几乎所有sqlserver的特性,如光标(记录集分页)等。好了,不吹了,自己看程序吧。 
asp函数 
复制代码 代码如下:
functionAnalyseKeyword(a_strSource) 
dimm_strDest,m_intLoop 
dimm_intBeginPos,m_intEndPos 
dimm_strHead,m_strMiddle,m_strTail 
m_strDest=a_strSource 
------------------------------处理空格------------------------------------------------------ 
首先去掉头尾空格 
m_strDest=ltrim(rtrim(m_strDest)) 
将&,and等替换成+、-、空格 
m_strDest=replace(m_strDest,&,+) 
m_strDest=replace(m_strDest,AND,+) 
m_strDest=replace(m_strDest,OR,chr(32)) 
m_strDest=replace(m_strDest,NOT,-) 
初始化变量,以使下面的循环进行 
m_intBeginPos=1 
dowhilem_intBeginPos<>0 
m_intBeginPos=instr(m_strDest,chr(32)) 
ifm_intBeginPos<>0then如果找到空格 
m_strHead=rtrim(ltrim(left(m_strDest,m_intBeginPos))) 
callprint([AnalyseKeyword()]:处理空格m_strHead=+m_strHead) 
m_strTail=rtrim(ltrim(right(m_strDest,len(m_strDest)-m_intBeginPos))) 
callprint([AnalyseKeyword()]:处理空格m_strTail=+m_strTail) 
m_strDest=m_strHead+*+m_strTail 
else 
exitdo 
endif 
loop 
m_strDest=replace(m_strDest,*,chr(32)) 
callprint([AnalyseKeyword()]:处理空格完毕后m_strDest=+m_strDest) 
-------------------------------空格处理完毕------------------------------------------------- 
-------------------处理单双引号----------------------------------------------------- 
首先将单引号替换为双引号 
m_strDest=replace(m_strDest,chr(39),chr(34)) 
置一个初值以使循环进行 
m_intBeginPos=1 
m_intEndPos=1 
m_strHead= 
m_strTail= 
dowhilem_intBeginPos<>0andm_intEndPos<>0 
如果发现双引号,则记下开始位置,查找下一个双引号 
m_intBeginPos=instr(m_strDest,chr(34)) 
ifm_intBeginPos<>0then如果找到第一个引号 
callprint([AnalyseKeyword()]:第一个引号出现的位置:+cstr(m_intBeginPos)) 
m_intEndPos=instr(m_intBeginPos+1,m_strDest,chr(34)) 
ifm_intEndPos<>0then如果找到第二个引号 
callprint([AnalyseKeyword()]:第二个引号出现的位置:+cstr(m_intEndPos)) 
将整个字符串按引号分隔成三段 
callprint([AnalyseKeyword()]:处理引号m_strDest=+m_strDest) 
m_strHead=left(m_strDest,m_intBeginPos-1) 
callprint([AnalyseKeyword()]:处理引号m_strHead=+m_strHead) 
m_strMiddle=mid(m_strDest,m_intBeginPos+1,m_intEndPos-m_intBeginPos-1) 
callprint([AnalyseKeyword()]:处理引号m_strMiddle=+m_strMiddle) 
m_strTail=right(m_strDest,len(m_strDest)-m_intEndPos) 
callprint([AnalyseKeyword()]:m_strTail=+m_strTail) 
如果在引号中有+号则作为字符处理,暂时替换成其他字符 
m_strMiddle=replace(m_strMiddle,+,) 
m_strDest=m_strHead+replace(rtrim(ltrim(m_strMiddle)),chr(32),#)+m_strTail 
else 
exitdo 
endif 
else 
exitdo 
endif 
loop 
m_strDest=replace(m_strDest,chr(34),+) 
callprint([AnalyseKeyword()]:处理引号完毕后m_strDest=+m_strDest) 
-------------------------------引号处理完毕------------------------------------------------- 
-------------------------------处理多个加号及加号两边的空格问题----------------------------- 
处理多个加号的问题,遇到多个加号则认为是字符串,而不是逻辑符 
m_strDest=replace(m_strDest,+++,) 
m_strDest=replace(m_strDest,++,) 
callprint([AnalyseKeyword()]:处理多个减号完毕后m_strDest=+m_strDest+) 
处理加号两边的空格 
m_strDest=replace(m_strDest,+,+) 
m_strDest=replace(m_strDest,+,+) 
m_strDest=replace(m_strDest,+,+) 
callprint([AnalyseKeyword()]:处理减号两边的空格完毕后m_strDest=+m_strDest+) 
-------------------------------处理加号完毕----------------------------- 
-------------------------------处理多个减号及减号两边的空格问题----------------------------- 
处理多个减号的问题,遇到多个减号则认为是字符串,而不是逻辑符 
m_strDest=replace(m_strDest,---,~~~) 
m_strDest=replace(m_strDest,--,~~) 
callprint([AnalyseKeyword()]:处理多个减号完毕后m_strDest=+m_strDest+) 
处理减号两边的空格 
m_strDest=replace(m_strDest,-,-) 
m_strDest=replace(m_strDest,-,-) 
m_strDest=replace(m_strDest,-,-) 
callprint([AnalyseKeyword()]:处理加号两边的空格完毕后m_strDest=+m_strDest+) 
-------------------------------处理减号完毕----------------------------- 
------------------------------处理字符串两头的加减号问题----------------- 
iflen(m_strDest)>=3then 
m_strHead=left(m_strDest,1) 
m_strMiddle=mid(m_strDest,2,len(m_strDest)-2) 
m_strTail=right(m_strDest,1) 
ifm_strHead=+orm_strHead=-then 
m_strHead= 
endif 
ifm_strTail=+orm_strTail=-then 
m_strTail= 
endif 
m_strDest=m_strHead+m_strMiddle+m_strTail 
endif 
----------------------------处理完毕------------------------------------- 
m_strDest=replace(m_strDest,--,~~) 
m_strDest=replace(m_strDest,++,) 
m_strDest=replace(m_strDest,chr(32),@) 
AnalyseKeyword=m_strDest 
callprint([AnalyseKeyword()]:全部处理完毕后m_strDest=+m_strDest+) 
endfunction 
%> 
存储过程 
/*********************************************************************/ 
/*procname:Up_ParseWordSearch*/ 
/**/ 
/*Description:关键字搜索*/ 
/**/ 
/*parameters:@a_strCategoryID分类id*/ 
/*@a_intPosition调用的位置*/ 
/*@a_strParseWord搜索关键字*/ 
/*@a_intRowCount限定最多取得记录数*/ 
/**/ 
/*date:2000/6/28*/ 
/**/ 
/*author:Liuyunpeng*/ 
/**/ 
/*history:*/ 
/*********************************************************************/ 
ifexists(select*fromsysobjectswhereid=object_id(up_ParseWordSearch)) 
dropprocup_ParseWordSearch 
go 
createprocup_ParseWordSearch@a_strParsewordvarchar(255), 
@a_strCategoryIDvarchar(255), 
@a_intPositiontinyint, 
@a_intRowCountint 
as 
declare@m_strSqlConditionvarchar(255)--Sql语句的条件部分 
declare@m_strSqlSelectvarchar(255)--Sql语句的选择部分 
declare@m_strSqlCategoryvarchar(100)--sql语句的分类部分 
/*根据调用位置决定sql的选择部分*/ 
select@m_strSqlSelect 
=case 
when@a_intPosition=4then--商品库 
selectProductID,Title=ProductName,Description=left(Description,100) 
+fromProductwhere 
when@a_intPosition=5then--商业机会库 
selectID,Title,Description=left(convert(varchar,content),100) 
+fromBusinessChancewhere 
when@a_intPosition=6then--公司库 
selectCompanyID,Title=CompanyName,Description=left(Description,100) 
+fromCompanywhere 
end 
/*根据分类ID决定sql的分类部分*/ 
select@m_strSqlCategory 
=case 
when@a_strCategoryID<>0thenCategoryIDlike+@a_strCategoryID+%and 
else 
end 
/*根据调用位置决定sql的条件部分*/ 
select@m_strSqlCondition 
=case 
when@a_intPosition=4--商品 
then(ProductNamelike%+@a_strParseWord+% 
+orDescriptionlike%+@a_strParseWord+% 
+orProducerNamelike%+@a_strParseWord+%) 
when@a_intPosition=5--商业机会 
then(Titlelike%+@a_strParseWord+% 
+orKeywordlike%+@a_strParseWord+%) 
when@a_intPosition=6 
then(CompanyNamelike%+@a_strParseWord+% 
+orDescription%+@a_strParseWord+%) 
end 
setrowcount@a_intRowCount 
exec(@m_strSqlSelect+@m_strSqlCategory+@m_strSqlCondition) 
setrowcount0 
go