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
  • 相关阅读:
    以中间件,路由,跨进程事件的姿势使用WebSocket
    傻瓜式解读koa中间件处理模块koa-compose
    企业管理系统前后端分离架构设计 系列一 权限模型篇
    vue权限路由实现方式总结
    3YAdmin-专注通用权限控制与表单的后台管理系统模板
    lazy-mock ,一个生成后端模拟数据的懒人工具
    vue-quasar-admin 一个包含通用权限控制的后台管理系统
    CSS中line-height与vertical-align
    IdentityServer4实现Token认证登录以及权限控制
    利用AOP实现SqlSugar自动事务
  • 原文地址:https://www.cnblogs.com/chenjunbiao/p/1760279.html
Copyright © 2011-2022 走看看