zoukankan      html  css  js  c++  java
  • AspNetCommerce中的一个带分页和排序的搜索功能的存储过程

    刚翻了翻<<>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
  • 相关阅读:
    太可爱了!CSS3 & SVG 制作的米老鼠钟表
    20个免费的 AngularJS 资源和开发教程
    比尔盖茨:反垄断案让我分心,不然微软定能打败安卓(胜者通吃的行业要不计代价的三班倒,评论很精彩)
    C++11 新特性之智能指针(shared_ptr, unique_ptr, weak_ptr)
    C++编译器会对没有构造函数的类生成默认构造函数吗?(有必要的时候才生成,要看情况。有反汇编验证)
    qt5信息提示框QMessageBox用法(很全)
    (RPC) Remote Procedure Call Protocol 远程过程调用协议
    分布式事务就是由多个本地事务组合而成的事务
    内存管理--虚拟内存管理技术
    NET适合搞大数据,机器学习、人工智能
  • 原文地址:https://www.cnblogs.com/chenjunbiao/p/1760279.html
Copyright © 2011-2022 走看看