|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
比较复杂,可以支持多种逻辑符,包括 + - and or 空格等,并且根据需要随便增加。可以根据条件选择在那个表中搜索,对速度也做了优化,可以说是很快的。当然因为是以前写的,存在不少毛病。存储过程中用到几乎所有sql server的特性,如光标(记录集分页)等。好了,不吹了,自己看程序吧。 asp 函数 function AnalyseKeyword(a_strSource) dim m_strDest , m_intLoop dim m_intBeginPos , m_intEndPos dim m_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 do while m_intBeginPos <> 0 m_intBeginPos = instr(m_strDest ,chr(32)) if m_intBeginPos <> 0 then \\\'假如找到空格 m_strHead = rtrim(ltrim(left ( m_strDest , m_intBeginPos ))) call print("[AnalyseKeyword()]:处理空格m_strHead = " + m_strHead) m_strTail = rtrim(ltrim(right (m_strDest , len(m_strDest) - m_intBeginPos))) call print("[AnalyseKeyword()]:处理空格m_strTail = " + m_strTail) m_strDest = m_strHead + "*" + m_strTail else exit do end if loop m_strDest = replace (m_strDest , "*" , chr(32)) call print("[AnalyseKeyword()]:处理空格完毕后m_strDest = " + m_strDest) \\\'-------------------------------空格处理完毕------------------------------------------------- \\\'-------------------处理单双引号----------------------------------------------------- \\\'首先将单引号替换为双引号 m_strDest = replace ( m_strDest , chr(39) , chr(34)) \\\'置一个初值以使循环进行 m_intBeginPos = 1 m_intEndPos =1 m_strHead = "" m_strTail = "" do while m_intBeginPos <> 0 and m_intEndPos <> 0 \\\'假如发现双引号,则记下开始位置,查找下一个双引号 m_intBeginPos = instr(m_strDest , chr(34)) if m_intBeginPos <> 0 then \\\'假如找到第一个引号 call print("[AnalyseKeyword()]:第一个引号出现的位置:" + cstr(m_intBeginPos)) m_intEndPos = instr(m_intBeginPos + 1 , m_strDest ,chr(34)) if m_intEndPos <> 0 then \\\'假如找到第二个引号 call print("[AnalyseKeyword()]:第二个引号出现的位置:" + cstr(m_intEndPos)) \\\'将整个字符串按引号分隔成三段 call print ("[AnalyseKeyword()]:处理引号m_strDest = " + m_strDest) m_strHead = left(m_strDest , m_intBeginPos - 1) call print ("[AnalyseKeyword()]:处理引号m_strHead = " + m_strHead) m_strMiddle = mid(m_strDest , m_intBeginPos + 1 , m_intEndPos - m_intBeginPos - 1) call print ("[AnalyseKeyword()]:处理引号m_strMiddle = " + m_strMiddle) m_strTail = right(m_strDest , len(m_strDest) - m_intEndPos) call print ("[AnalyseKeyword()]:m_strTail = " + m_strTail) \\\'假如在引号中有+号则作为字符处理,暂时替换成其他字符 m_strMiddle = replace(m_strMiddle , "+" , "|") m_strDest = m_strHead + replace(rtrim(ltrim(m_strMiddle)) , chr(32) , "#") + m_strTail else exit do end if else exit do end if loop m_strDest = replace(m_strDest , chr(34) , "+") call print ("[AnalyseKeyword()]:处理引号完毕后m_strDest = " + m_strDest) \\\'-------------------------------引号处理完毕------------------------------------------------- \\\'-------------------------------处理多个加号及加号两边的空格问题----------------------------- \\\'处理多个加号的问题,碰到多个加号则认为是字符串,而不是逻辑符 m_strDest = replace (m_strDest , "+++" ,"|||") m_strDest = replace (m_strDest , "++" , "||") call print ("[AnalyseKeyword()]:处理多个减号完毕后m_strDest = \\\'" + m_strDest + "\\\'") \\\'处理加号两边的空格 m_strDest = replace(m_strDest , " +" , "+") m_strDest = replace(m_strDest , "+ " , "+") m_strDest = replace(m_strDest , " + " , "+") call print ("[AnalyseKeyword()]:处理减号两边的空格完毕后m_strDest = \\\'" + m_strDest + "\\\'") \\\'-------------------------------处理加号完毕----------------------------- \\\'-------------------------------处理多个减号及减号两边的空格问题----------------------------- \\\'处理多个减号的问题,碰到多个减号则认为是字符串,而不是逻辑符 m_strDest = replace (m_strDest , "---" ,"~~~") m_strDest = replace (m_strDest , "--" , "~~") call print ("[AnalyseKeyword()]:处理多个减号完毕后m_strDest = \\\'" + m_strDest + "\\\'") \\\'处理减号两边的空格 m_strDest = replace(m_strDest , " -" , "-") m_strDest = replace(m_strDest , "- " , "-") m_strDest = replace(m_strDest , " - " , "-") call print ("[AnalyseKeyword()]:处理加号两边的空格完毕后m_strDest = \\\'" + m_strDest + "\\\'") \\\'-------------------------------处理减号完毕----------------------------- \\\'------------------------------处理字符串两头的加减号问题----------------- if len(m_strDest) >= 3 then m_strHead = left(m_strDest , 1) m_strMiddle = mid(m_strDest , 2 , len(m_strDest) - 2) m_strTail = right(m_strDest , 1) if m_strHead = "+" or m_strHead = "-" then m_strHead = "" end if if m_strTail = "+" or m_strTail = "-" then m_strTail = "" end if m_strDest = m_strHead + m_strMiddle + m_strTail end if \\\'----------------------------处理完毕------------------------------------- m_strDest = replace(m_strDest , "--" , "~~") m_strDest = replace(m_strDest , "++" , "||") m_strDest = replace(m_strDest , chr(32) , "@") AnalyseKeyword = m_strDest call print ("[AnalyseKeyword()]:全部处理完毕后m_strDest = \\\'" + m_strDest + "\\\'") end function %> 存储过程 /*********************************************************************/ /* proc name : Up_ParseWordSearch */ /* */ /* Description: 要害字搜索 */ /* */ /* parameters: @a_strCategoryID 分类id */ /* @a_intPosition 调用的位置 */ /* @a_strParseWord 搜索要害字 */ /* @a_intRowCount 限定最多取得记录数 */ /* */ /*********************************************************************/ if exists (select * from sysobjects where id = object_id("up_ParseWordSearch")) drop proc up_ParseWordSearch go create proc up_ParseWordSearch @a_strParseword varchar(255) , @a_strCategoryID varchar(255) , @a_intPosition tinyint , @a_intRowCount int as declare @m_strSqlCondition varchar(255) --Sql语句的条件部分 declare @m_strSqlSelect varchar(255) --Sql语句的选择部分 declare @m_strSqlCategory varchar(100) --sql语句的分类部分 /*根据调用位置决定sql的选择部分*/ select @m_strSqlSelect = case when @a_intPosition = 4 then --商品库 "select ProductID , \\\'Title\\\' = ProductName , \\\'Description\\\' = left(Description , 100) " + " from Product where " when @a_intPosition = 5 then --商业机会库 "select ID , Title ,\\\'Description\\\' = left(convert(varchar,content) , 100) " + " from BusinessChance where " when @a_intPosition = 6 then --公司库 "select CompanyID , \\\'Title\\\' = CompanyName , \\\'Description\\\' =left(Description , 100) " + " from Company where " end /*根据分类ID决定sql的分类部分*/ select @m_strSqlCategory = case when @a_strCategoryID <> "0" then " CategoryID like \\\'" + @a_strCategoryID + "%\\\' and " else "" end /*根据调用位置决定sql的条件部分*/ select @m_strSqlCondition = case when @a_intPosition = 4 --商品 then "(ProductName like \\\'%" + @a_strParseWord + "%\\\'" + " or Description like \\\'%" + @a_strParseWord + "%\\\'" + " or ProducerName like \\\'%" + @a_strParseWord + "%\\\') " when @a_intPosition = 5 --商业机会 then "(Title like \\\'%" + @a_strParseWord + "%\\\'" + " or Keyword like \\\'%" + @a_strParseWord + "%\\\') " when @a_intPosition = 6 then "(CompanyName like \\\'%" + @a_strParseWord + "%\\\'" + " or Description \\\'%" + @a_strParseWord + "%\\\') " end set rowcount @a_intRowCount exec (@m_strSqlSelect + @m_strSqlCategory + @m_strSqlCondition) set rowcount 0 go 返回类别: 教程 上一教程: 如何增强ASP程序性能(3) 下一教程: 提高ASP性能的最佳选择(三) 您可以阅读与"结合ASP和存储过程做的搜索程序"相关的教程: · 利用SQL的存储过程实现DOS命令的ASP程序 · ASP与存储过程 · ASP+ORACLE分页方式(不用存储过程) · ASP+SQL SERVER 分页方式(不用存储过程) · 利用索引服务和ASP建立面向整个网站搜索程序 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |