当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:20:00  来源:本站整理

在SQL Server 2005顶用存储历程实现搜索功效[MSSQL防范]

赞助商链接



  本文“在SQL Server 2005顶用存储历程实现搜索功效[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

   目前很多网站都供应了站内的搜索功效,有的很简单在SQL语句里加一个条件如:where names like ‘%words%’便可以实现最基本的搜索了.

 

   我们来看看功效强盛一点,复杂一点的搜索是若何实现的(在SQL SERVER200/2005通过存储历程实现搜索算法).

 

   我们把用户的搜索可以分为以下两种:

   1.切确搜索,就是把用户输入的各个词语当作一个整体,不分割搜索.

   2.百度,GOOGLE一样的,按空格把输入的每一个词别离,只要包含这些词语,而不管呈现的次序,称为ALL-Word Search.

   3.对输入的词只要有一个呈现就为匹配 称为Any-Word Search


1、对搜索后果举行排序的算法

   在前面提到的LIKE语句最大的问题就是搜索的后果是没有经过排序的,我们不知道后果呈目前的次序是若何的,因为它是随机的.像百度,GOOGLE城市对后果用算法举行排序再显示的.好我们也来成立一个简单的排序法.一个很常见的算法是计算关键词在被搜索内容中呈现的次数,次数最多的排在后果的第一位.我们的是在存储历程中实现这个算法的,而在SQLSERVER中没有供应计算关键词在被搜索内容中呈现的次数这样的函数,我们要自己写一个UDFUser-Defined Functions,UDFSQLSERVER的内部函数,可以被存储历程调用大概被其他UDF调用.函数以下:

 1在SQL Server 2005顶用存储历程实现搜索功效CREATE FUNCTION dbo.WordCount
 2在SQL Server 2005顶用存储历程实现搜索功效
 3在SQL Server 2005顶用存储历程实现搜索功效(@Word VARCHAR(15), 
 4在SQL Server 2005顶用存储历程实现搜索功效
 5在SQL Server 2005顶用存储历程实现搜索功效@Phrase VARCHAR(1000))
 6在SQL Server 2005顶用存储历程实现搜索功效
 7在SQL Server 2005顶用存储历程实现搜索功效RETURNS SMALLINT
 8在SQL Server 2005顶用存储历程实现搜索功效
 9在SQL Server 2005顶用存储历程实现搜索功效AS
10在SQL Server 2005顶用存储历程实现搜索功效
11在SQL Server 2005顶用存储历程实现搜索功效BEGIN
12在SQL Server 2005顶用存储历程实现搜索功效
13在SQL Server 2005顶用存储历程实现搜索功效/* 假如@Word 大概@Phrase 为空返回 0 */
14在SQL Server 2005顶用存储历程实现搜索功效
15在SQL Server 2005顶用存储历程实现搜索功效IF @Word IS NULL OR @Phrase IS NULL RETURN 0
16在SQL Server 2005顶用存储历程实现搜索功效
17在SQL Server 2005顶用存储历程实现搜索功效/* @BiggerWord 比@Word长一个字符 */
18在SQL Server 2005顶用存储历程实现搜索功效
19在SQL Server 2005顶用存储历程实现搜索功效DECLARE @BiggerWord VARCHAR(21)
20在SQL Server 2005顶用存储历程实现搜索功效
21在SQL Server 2005顶用存储历程实现搜索功效SELECT @BiggerWord = @Word + 'x'
22在SQL Server 2005顶用存储历程实现搜索功效
23在SQL Server 2005顶用存储历程实现搜索功效/*在 @Phrase用@BiggerWord替换@Word */
24在SQL Server 2005顶用存储历程实现搜索功效
25在SQL Server 2005顶用存储历程实现搜索功效DECLARE @BiggerPhrase VARCHAR(2000)
26在SQL Server 2005顶用存储历程实现搜索功效
27在SQL Server 2005顶用存储历程实现搜索功效SELECT @BiggerPhrase = REPLACE (@Phrase@Word@BiggerWord)
28在SQL Server 2005顶用存储历程实现搜索功效
29在SQL Server 2005顶用存储历程实现搜索功效/* 相减后果就是呈现的次数了 */
30在SQL Server 2005顶用存储历程实现搜索功效
31在SQL Server 2005顶用存储历程实现搜索功效RETURN LEN(@BiggerPhrase- LEN(@Phrase)
32在SQL Server 2005顶用存储历程实现搜索功效
33在SQL Server 2005顶用存储历程实现搜索功效END
34在SQL Server 2005顶用存储历程实现搜索功效

 

以上就是整个UDF,它用了一个很高效的办法来计算关键词呈现的次数.

 

2、参数传送

用户输入的关键词从一个到多个不等,我们可以把参数固定为@word1~@word5,这样对比方面实现.当用户输入超越5个时,忽视不计,少于5个的地方视为空.其实GOOGLE也是这样做的,只是GOOGLE的最大词语限制是10个.

3、搜索的实现历程

假定我们对Product表举行搜索,Product字段有:Id,Name ,Descripton(产品描写),搜索要同时对Name Description举行.

Any-World Search实现以下:

 1在SQL Server 2005顶用存储历程实现搜索功效SELECT Product.Name, 
 2在SQL Server 2005顶用存储历程实现搜索功效       3 * WordCount(@Word1, Name) + WordCount(@Word1, Description) +
 3在SQL Server 2005顶用存储历程实现搜索功效
 4在SQL Server 2005顶用存储历程实现搜索功效       3 * WordCount(@Word2, Name) + WordCount(@Word2, Description) +
 5在SQL Server 2005顶用存储历程实现搜索功效
 6在SQL Server 2005顶用存储历程实现搜索功效       在SQL Server 2005顶用存储历程实现搜索功效
 7在SQL Server 2005顶用存储历程实现搜索功效
 8在SQL Server 2005顶用存储历程实现搜索功效       AS Rank
 9在SQL Server 2005顶用存储历程实现搜索功效FROM Product
10在SQL Server 2005顶用存储历程实现搜索功效
11在SQL Server 2005顶用存储历程实现搜索功效

 

这里对Name赋予权重为3,Description1(大家按照实际情形赋予差别的权重),Rank是计算列,通过前面定义的UDF计算所关键词呈现的次数乘上权重等到的.


一样的
All-Word Search实现以下:

 1在SQL Server 2005顶用存储历程实现搜索功效SELECT Product.Name, 
 2在SQL Server 2005顶用存储历程实现搜索功效
 3在SQL Server 2005顶用存储历程实现搜索功效       (3 * WordCount(@Word1, Name) + WordCount(@Word1, Description)) *
 4在SQL Server 2005顶用存储历程实现搜索功效
 5在SQL Server 2005顶用存储历程实现搜索功效       CASE 
 6在SQL Server 2005顶用存储历程实现搜索功效
 7在SQL Server 2005顶用存储历程实现搜索功效          WHEN @Word2 IS NULL THEN 1 
 8在SQL Server 2005顶用存储历程实现搜索功效
 9在SQL Server 2005顶用存储历程实现搜索功效            ELSE 3 * WordCount(@Word2, Name) + WordCount(@Word2, Description)
10在SQL Server 2005顶用存储历程实现搜索功效
11在SQL Server 2005顶用存储历程实现搜索功效       END *
12在SQL Server 2005顶用存储历程实现搜索功效
13在SQL Server 2005顶用存储历程实现搜索功效       在SQL Server 2005顶用存储历程实现搜索功效
14在SQL Server 2005顶用存储历程实现搜索功效
15在SQL Server 2005顶用存储历程实现搜索功效       AS Rank
16在SQL Server 2005顶用存储历程实现搜索功效
17在SQL Server 2005顶用存储历程实现搜索功效FROM Product
18在SQL Server 2005顶用存储历程实现搜索功效


    这时把每个关键词呈现的次数相乘只要一个没呈现RANK就为0,为0就是搜索后果为空.

还可以这样实现:


 1在SQL Server 2005顶用存储历程实现搜索功效SELECT Product.Name, 
 2在SQL Server 2005顶用存储历程实现搜索功效       CASE 
 3在SQL Server 2005顶用存储历程实现搜索功效         WHEN @Word1 IS NULL THEN 0 
 4在SQL Server 2005顶用存储历程实现搜索功效         ELSE ISNULL(NULLIF(dbo.WordCount(@Word1, Name + ' ' + Description), 0), -1000)
 5在SQL Server 2005顶用存储历程实现搜索功效       END +
 6在SQL Server 2005顶用存储历程实现搜索功效       CASE 
 7在SQL Server 2005顶用存储历程实现搜索功效         WHEN @Word2 IS NULL THEN 0 
 8在SQL Server 2005顶用存储历程实现搜索功效         ELSE ISNULL(NULLIF(dbo.WordCount(@Word2, Name + ' ' + Description), 0), -1000)
 9在SQL Server 2005顶用存储历程实现搜索功效       END +
10在SQL Server 2005顶用存储历程实现搜索功效       在SQL Server 2005顶用存储历程实现搜索功效
11在SQL Server 2005顶用存储历程实现搜索功效       AS Rank
12在SQL Server 2005顶用存储历程实现搜索功效FROM Product

对没呈现的关键词赋值-1000,这样Rank就必定为负数,负数表示搜索后果为空.

 

 

4、对后果举行分页

搜索的后果大概很多,对后果分页可以提高性能.我在如安在数据层分页以提高性能已经阐明了若何用存储历程举行分页了,这里就不在具体复述了.

历程简单来说就是成立一个暂时表,表中包含行号,读取时按行号来读取数据


5、完好代码

     经过前面的解析,完好代码以下:

  1在SQL Server 2005顶用存储历程实现搜索功效CREATE PROCEDURE SearchCatalog 
  2在SQL Server 2005顶用存储历程实现搜索功效(      
  3在SQL Server 2005顶用存储历程实现搜索功效 @PageNumber TINYINT,
  4在SQL Server 2005顶用存储历程实现搜索功效 @ProductsPerPage TINYINT,
  5在SQL Server 2005顶用存储历程实现搜索功效 @HowManyResults SMALLINT OUTPUT,
  6在SQL Server 2005顶用存储历程实现搜索功效 @AllWords BIT,
  7在SQL Server 2005顶用存储历程实现搜索功效 @Word1 VARCHAR(15= NULL,
  8在SQL Server 2005顶用存储历程实现搜索功效 @Word2 VARCHAR(15= NULL,
  9在SQL Server 2005顶用存储历程实现搜索功效 @Word3 VARCHAR(15= NULL,
 10在SQL Server 2005顶用存储历程实现搜索功效 @Word4 VARCHAR(15= NULL,
 11在SQL Server 2005顶用存储历程实现搜索功效 @Word5 VARCHAR(15= NULL)
 12在SQL Server 2005顶用存储历程实现搜索功效AS
 13在SQL Server 2005顶用存储历程实现搜索功效/* 成立暂时表,保存搜索的后果(Sql Server2005实用,Sql Server2000见如安在数据层分页以提高性能) */
 14在SQL Server 2005顶用存储历程实现搜索功效DECLARE @Products TABLE
 15在SQL Server 2005顶用存储历程实现搜索功效(RowNumber SMALLINT IDENTITY (1,1NOT NULL,
 16在SQL Server 2005顶用存储历程实现搜索功效 ID INT,
 17在SQL Server 2005顶用存储历程实现搜索功效 Name VARCHAR(50),
 18在SQL Server 2005顶用存储历程实现搜索功效 Description VARCHAR(1000),
 19在SQL Server 2005顶用存储历程实现搜索功效Rank INT)
 20在SQL Server 2005顶用存储历程实现搜索功效
 21在SQL Server 2005顶用存储历程实现搜索功效/* Any-words search */
 22在SQL Server 2005顶用存储历程实现搜索功效IF @AllWords = 0 
 23在SQL Server 2005顶用存储历程实现搜索功效   INSERT INTO @Products           
 24在SQL Server 2005顶用存储历程实现搜索功效   SELECT ID, Name, Description,
 25在SQL Server 2005顶用存储历程实现搜索功效        3 * dbo.WordCount(@Word1, Name) + dbo.WordCount(@Word1, Description) +
 26在SQL Server 2005顶用存储历程实现搜索功效
 27在SQL Server 2005顶用存储历程实现搜索功效        3 * dbo.WordCount(@Word2, Name) + dbo.WordCount(@Word2, Description) +
 28在SQL Server 2005顶用存储历程实现搜索功效
 29在SQL Server 2005顶用存储历程实现搜索功效        3 * dbo.WordCount(@Word3, Name) + dbo.WordCount(@Word3, Description) +
 30在SQL Server 2005顶用存储历程实现搜索功效
 31在SQL Server 2005顶用存储历程实现搜索功效        3 * dbo.WordCount(@Word4, Name) + dbo.WordCount(@Word4, Description) +
 32在SQL Server 2005顶用存储历程实现搜索功效
 33在SQL Server 2005顶用存储历程实现搜索功效        3 * dbo.WordCount(@Word5, Name) + dbo.WordCount(@Word5, Description) 
 34在SQL Server 2005顶用存储历程实现搜索功效
 35在SQL Server 2005顶用存储历程实现搜索功效          AS Rank
 36在SQL Server 2005顶用存储历程实现搜索功效
 37在SQL Server 2005顶用存储历程实现搜索功效   FROM Product
 38在SQL Server 2005顶用存储历程实现搜索功效   ORDER BY Rank DESC
 39在SQL Server 2005顶用存储历程实现搜索功效
 40在SQL Server 2005顶用存储历程实现搜索功效/* all-words search */
 41在SQL Server 2005顶用存储历程实现搜索功效
 42在SQL Server 2005顶用存储历程实现搜索功效IF @AllWords = 1
 43在SQL Server 2005顶用存储历程实现搜索功效
 44在SQL Server 2005顶用存储历程实现搜索功效   INSERT INTO @Products           
 45在SQL Server 2005顶用存储历程实现搜索功效
 46在SQL Server 2005顶用存储历程实现搜索功效   SELECT ID, Name, Description,
 47在SQL Server 2005顶用存储历程实现搜索功效
 48在SQL Server 2005顶用存储历程实现搜索功效          (3 * dbo.WordCount(@Word1, Name) + dbo.WordCount
 49在SQL Server 2005顶用存储历程实现搜索功效
 50在SQL Server 2005顶用存储历程实现搜索功效(@Word1, Description)) *
 51在SQL Server 2005顶用存储历程实现搜索功效
 52在SQL Server 2005顶用存储历程实现搜索功效          CASE 
 53在SQL Server 2005顶用存储历程实现搜索功效
 54在SQL Server 2005顶用存储历程实现搜索功效           WHEN @Word2 IS NULL THEN 1 
 55在SQL Server 2005顶用存储历程实现搜索功效
 56在SQL Server 2005顶用存储历程实现搜索功效           ELSE 3 * dbo.WordCount(@Word2, Name) + dbo.WordCount(@Word2
 57在SQL Server 2005顶用存储历程实现搜索功效
 58在SQL Server 2005顶用存储历程实现搜索功效Description)
 59在SQL Server 2005顶用存储历程实现搜索功效
 60在SQL Server 2005顶用存储历程实现搜索功效          END *
 61在SQL Server 2005顶用存储历程实现搜索功效
 62在SQL Server 2005顶用存储历程实现搜索功效          CASE 
 63在SQL Server 2005顶用存储历程实现搜索功效
 64在SQL Server 2005顶用存储历程实现搜索功效           WHEN @Word3 IS NULL THEN 1 
 65在SQL Server 2005顶用存储历程实现搜索功效
 66在SQL Server 2005顶用存储历程实现搜索功效           ELSE 3 * dbo.WordCount(@Word3, Name) + dbo.WordCount(@Word3
 67在SQL Server 2005顶用存储历程实现搜索功效
 68在SQL Server 2005顶用存储历程实现搜索功效Description)
 69在SQL Server 2005顶用存储历程实现搜索功效
 70在SQL Server 2005顶用存储历程实现搜索功效          END *
 71在SQL Server 2005顶用存储历程实现搜索功效
 72在SQL Server 2005顶用存储历程实现搜索功效          CASE 
 73在SQL Server 2005顶用存储历程实现搜索功效
 74在SQL Server 2005顶用存储历程实现搜索功效           WHEN @Word4 IS NULL THEN 1 
 75在SQL Server 2005顶用存储历程实现搜索功效
 76在SQL Server 2005顶用存储历程实现搜索功效           ELSE 3 * dbo.WordCount(@Word4, Name) + dbo.WordCount(@Word4
 77在SQL Server 2005顶用存储历程实现搜索功效
 78在SQL Server 2005顶用存储历程实现搜索功效Description)
 79在SQL Server 2005顶用存储历程实现搜索功效
 80在SQL Server 2005顶用存储历程实现搜索功效          END *
 81在SQL Server 2005顶用存储历程实现搜索功效
 82在SQL Server 2005顶用存储历程实现搜索功效          CASE 
 83在SQL Server 2005顶用存储历程实现搜索功效
 84在SQL Server 2005顶用存储历程实现搜索功效           WHEN @Word5 IS NULL THEN 1 
 85在SQL Server 2005顶用存储历程实现搜索功效
 86在SQL Server 2005顶用存储历程实现搜索功效           ELSE 3 * dbo.WordCount(@Word5, Name) + dbo.WordCount(@Word5
 87在SQL Server 2005顶用存储历程实现搜索功效
 88在SQL Server 2005顶用存储历程实现搜索功效Description)
 89在SQL Server 2005顶用存储历程实现搜索功效
 90在SQL Server 2005顶用存储历程实现搜索功效          END
 91在SQL Server 2005顶用存储历程实现搜索功效
 92在SQL Server 2005顶用存储历程实现搜索功效          AS Rank
 93在SQL Server 2005顶用存储历程实现搜索功效
 94在SQL Server 2005顶用存储历程实现搜索功效   FROM Product
 95在SQL Server 2005顶用存储历程实现搜索功效
 96在SQL Server 2005顶用存储历程实现搜索功效   ORDER BY Rank DESC
 97在SQL Server 2005顶用存储历程实现搜索功效
 98在SQL Server 2005顶用存储历程实现搜索功效/* 在外部变量保存搜索后果数 */
 99在SQL Server 2005顶用存储历程实现搜索功效
100在SQL Server 2005顶用存储历程实现搜索功效SELECT @HowManyResults = COUNT(*
101在SQL Server 2005顶用存储历程实现搜索功效
102在SQL Server 2005顶用存储历程实现搜索功效FROM @Products 
103在SQL Server 2005顶用存储历程实现搜索功效
104在SQL Server 2005顶用存储历程实现搜索功效WHERE Rank > 0
105在SQL Server 2005顶用存储历程实现搜索功效
106在SQL Server 2005顶用存储历程实现搜索功效/* 按页返回后果*/
107在SQL Server 2005顶用存储历程实现搜索功效
108在SQL Server 2005顶用存储历程实现搜索功效SELECT ProductID, Name, Description, Price, Image1FileName,
109在SQL Server 2005顶用存储历程实现搜索功效
110在SQL Server 2005顶用存储历程实现搜索功效 Image2FileName, Rank
111在SQL Server 2005顶用存储历程实现搜索功效
112在SQL Server 2005顶用存储历程实现搜索功效FROM @Products
113在SQL Server 2005顶用存储历程实现搜索功效
114在SQL Server 2005顶用存储历程实现搜索功效WHERE Rank > 0
115在SQL Server 2005顶用存储历程实现搜索功效
116在SQL Server 2005顶用存储历程实现搜索功效  AND RowNumber BETWEEN (@PageNumber-1* @ProductsPerPage + 1 
117在SQL Server 2005顶用存储历程实现搜索功效
118在SQL Server 2005顶用存储历程实现搜索功效                    AND @PageNumber * @ProductsPerPage
119在SQL Server 2005顶用存储历程实现搜索功效ORDER BY Rank DESC

 

至此一个简单的搜索算法就实现了.   以上是“在SQL Server 2005顶用存储历程实现搜索功效[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 在SQL Server中利用SQL语句查询一个存储历程被别的全部的存储历程引用的存储历程名
  • 在SQL Server 2005中成立数据库镜像的步骤及事项
  • 在SQL2005 轻松配置SSIS包
  • 在SQL中删除反复记录(多种办法)
  • 在SQL Server的存储历程中调用Com组件
  • 在SQLServer中保存和输出图片
  • 在SQLSERVER里写了一个Split函数
  • 在SQL Server中快速删除反复记录
  • 在SQL Server中保存和输出图片
  • 如安在SQL Server数据库差别版本中存储数据
  • <b>在SQL Server中实现循环每一行做一定的操作</b>
  • 在SQL Server数据库中成批导入数据四种办法
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .