结合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