您的位置:首页 > 编程语言 > ASP

AspNetCommerce中的一个带分页和排序的搜索功能的存储过程

2005-01-11 12:17 645 查看
刚翻了翻<<>SQL SERVER 性能调校一书>,原来LIKE N'%' + @SearchKey + N'%'这样并不符合书中所说的SARGs原则,并无法

利用有序的数据结构搭配二分查找法来快速寻数据,如果写成LIKE  @SearchKey + N'%'就符合了,但是如何能做到

LIKE N'%' + @SearchKey + N'%'的功能,但又实现符合SARGs原则?

ALTER PROCEDURE dbo.vw_Commerce_ProductBrowse_PagingQuickSearch

(

 @SearchKey nvarchar(200),--要搜索的关键字

 @SortType int,--排序类型,根据排序类型的整型序号来决定使用哪种排序方式,<DEFAULT>值为0

 @StartRow int,--表示从第几行开始,与PageIndex是不相同的!

 @MaxRows int  --表示列出多少行

)

AS

 /* SET NOCOUNT ON */

 --1.设置页范围

 DECLARE @PageLowerBound INT

    DECLARE @PageUpperBound INT

    DECLARE @TotalRecords   INT

    SET @PageLowerBound = @StartRow

    SET @PageUpperBound = @MaxRows -1 + @PageLowerBound

    --2.创建一个临时表以保存搜索结果

    CREATE TABLE #PageIndexForProductBrowse

    (

        IndexId int IDENTITY (0, 1) NOT NULL,

        SKU int

    )

    --3.把数据添加进临时表

    INSERT INTO #PageIndexForProductBrowse (SKU)

    SELECT b.SKU

    FROM dbo.vw_Commerce_ProductBrowse b

    WHERE     (b.Name LIKE N'%' + @SearchKey + N'%') OR

                     (b.ShortDescription LIKE N'%' + @SearchKey + N'%') OR

                     (b.LongDescription LIKE N'%' + @SearchKey + N'%') OR

                     (b.SkuDesc LIKE N'%' + @SearchKey + N'%')

    --4.检索出受影响的行数(总共的记录数)

    SELECT @TotalRecords = @@ROWCOUNT

    --5.联合临时表和vw_Commerce_ProductBrowse检索出合符条件的数据

    --*创建要动态运行的SQL字符串*

    DECLARE @SQLString nvarchar(500)--动态SQL字符串命令

    DECLARE @Parm nvarchar(500)

    SET @SQLString =

    N'SELECT b.ProductId, b.Name, b.ShortDescription, b.LongDescription, b.CategoryId, b.ParentCategoryId, b.SKU, '+

    N' b.SkuDesc, b.RetailPrice, b.ActualPrice, b.VIPPrice, b.DiamondVIPPrive, b.QtyOnHand, b.Unit '+

    N'FROM dbo.vw_Commerce_ProductBrowse b,#PageIndexForProductBrowse p '+

    N'WHERE b.SKU = p.SKU AND p.IndexId >= @MyPageLowerBound AND p.IndexId <= @MyPageUpperBound '

    SELECT @SQLString = @SQLString + CASE @SortType

     WHEN 0 THEN (N'ORDER BY b.ActualPrice')

     WHEN 1 THEN (N'ORDER BY b.ActualPrice DESC')

     WHEN 2 THEN (N'ORDER BY b.ActualPrice DESC')

     ELSE NULL

 END

 --*定义各个参数的数据类型*

 SET @Parm = N'@MyPageLowerBound INT,@MyPageUpperBound INT'

 --*设置参数值*

 --*正式执行*

    EXECUTE sp_executesql @SQLString,

        @Parm,

        @MyPageLowerBound = @PageLowerBound,

        @MyPageUpperBound = @PageUpperBound

 --返回合符条件的总记录数

 RETURN @TotalRecords
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: