时间: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邮箱联系删除。
ASP调用SQLSERVER存储程序出处http://mandType=4'命令类别为4,表示为存储过程SetcmdTemp.ActiveConnection=
ASP调用带参数存储过程的几种方式选择自hxfwsk的Blog关键字存储过程出处作者:讨饭猫ASP调用带参数存储过程的几种方式最近有很多的朋友问到调用存储过程的
本文实例讲述了asp.net中IDataParameter调用存储过程的实现方法,是asp.net数据库程序设计中非常实用的技巧。分享给大家供大家参考。具体实现
本文实例讲述了oracle存储过程、函数和触发器用法。分享给大家供大家参考,具体如下:一、存储过程和存储函数指存储在数据库中供所有用户程序调用的子程序叫存储过程
下面将在INDEXSERVER和ASP结合建立搜索引擎过程中的发现的几点需要注意的问题提供给大家,供大家参考、探讨; 1、编录一定要存放在需要索引的目录之