结合asp和存储过程做的搜索程序

时间:2021-05-18

比较复杂,可以支持多种逻辑符,包括+-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
%>


存储过程
/*********************************************************************/














/*********************************************************************/

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语句的分类部分


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


select@m_strSqlCategory
=case
when@a_strCategoryID<>"0"then"CategoryIDlike'"+@a_strCategoryID+"%'and"
else""
end


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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章