惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 热门话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Project Zero
Project Zero
V
Vulnerabilities – Threatpost
Cisco Talos Blog
Cisco Talos Blog
P
Palo Alto Networks Blog
C
Cisco Blogs
A
Arctic Wolf
月光博客
月光博客
The GitHub Blog
The GitHub Blog
T
The Blog of Author Tim Ferriss
量子位
小众软件
小众软件
Latest news
Latest news
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
N
Netflix TechBlog - Medium
K
Kaspersky official blog
人人都是产品经理
人人都是产品经理
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
Y
Y Combinator Blog
P
Proofpoint News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
M
MIT News - Artificial intelligence
T
Threat Research - Cisco Blogs
S
Schneier on Security
D
Docker
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
GbyAI
GbyAI
有赞技术团队
有赞技术团队
Google DeepMind News
Google DeepMind News
The Hacker News
The Hacker News
H
Help Net Security
Simon Willison's Weblog
Simon Willison's Weblog
J
Java Code Geeks
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tenable Blog
B
Blog
Know Your Adversary
Know Your Adversary
IT之家
IT之家

博客园 - 牟向阳

Implementing SQL Server Row and Cell Level Security Daily English 你知道你的後照鏡調錯了嗎?原來裡面隱藏著視線死角! Silverlight Freezing & Crash Silverlight 中实现Service同步调用 Silverlight:获取ContentTemplate中的命名控件 silverlight 4常用的多线程技术 推荐几款Silverlight Tools【转载】 一个配置文件的Mapping Emit Vs CodeDom Custom DataContractSerializerOperationBehavior SQL Service查询分析 WPF&Silverlight精髓 WCF学习经验分享,如何更好地学习WCF? 后台管理界面收集 两个使用的Ajax Demo 自学面向对象 发几个有价值的.net源码 我是如何带领团队开发项目的
支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)
牟向阳 · 2010-05-22 · via 博客园 - 牟向阳

1,场景:根据学生编号查询,返回该学生所在班级的所有学生。支持分页、自定义排序及结果集自动定位到查询条件的学生编号所在页。

CREATE PROC [dbo].[Sp_testpagerandsorting] (@GroupID     INT,
                                            @CurrentId   INT,
                                            @TimeFrom    DATETIME,
                                            @TimeTo      DATETIME,
                                            @OrderBy     CHAR(50),
                                            @PageSize    INT,
                                            @CurrentPage INT)
AS
  SET nocount ON

  BEGIN
      DECLARE @StartNumber        INT,
              @EndNumber          INT,
              @CurrentIdRowNumber INT,
              @RecordCount        INT,
              @EndPageIndex       INT
      DECLARE @RowNumberTable TABLE (
        rownumber INT IDENTITY (1, 1),
        id        INT )

      --step 1: Build sort id list -------------------------------------------------------       
      INSERT INTO @RowNumberTable
                  (id)
      SELECT sm.id AS id
      FROM   dbo.test sm WITH (nolock)
      WHERE  indate BETWEEN Coalesce(@TimeFrom, indate) AND
                            Coalesce(@TimeTo, indate)
             AND sm.groupid = @GroupID
      ORDER  BY CASE
                  WHEN @OrderBy = 'InDate desc' THEN ( Row_number() OVER (ORDER BY indate DESC))
                  WHEN @OrderBy = 'InDate asc' THEN (Row_number() OVER (ORDER BY indate ASC))
                  WHEN @OrderBy = 'Id asc' THEN (Row_number() OVER (ORDER BY sm.id ASC))
                  WHEN @OrderBy = 'Id desc' THEN (Row_number() OVER (ORDER BY sm.id DESC))
                  WHEN @OrderBy = 'Name asc' THEN (Row_number() OVER (ORDER BY sm.name ASC))
                  WHEN @OrderBy = 'Name desc' THEN (Row_number() OVER (ORDER BY sm.name DESC) )
                END

      --step 2: Reset page index with current id -----------------------------------------  
      IF @CurrentIdNumber > 0
        BEGIN
            SELECT TOP 1 @CurrentIdRowNumber = rownumber
            FROM   @RowNumberTable
            WHERE  id = @CurrentIdNumber

            IF @CurrentIdRowNumber > 0
              BEGIN
                  IF @CurrentPage = 0
                    BEGIN
                        SET @CurrentPage = Ceiling(CAST(@CurrentIdRowNumber AS DECIMAL) / CAST (@PageSize AS DECIMAL))
                    END
              END
        END
      ELSE
        BEGIN
            IF @CurrentPage = 0
              BEGIN
                  SET @CurrentPage = 1
              END
        END

      --step 3: Set recordCount -----------------------------------------      
      SELECT @RecordCount = COUNT(1)
      FROM   @RowNumberTable

      --step 4: Calc startNumber & endNumber -----------------------------------------   
      SELECT @StartNumber = @PageSize * ( @CurrentPage - 1 ),
             @EndNumber = @PageSize * ( @CurrentPage - 1 ) + @pageSize,
             @EndPageIndex = Ceiling(CAST(@RecordCount AS DECIMAL) / CAST(@PageSize AS DECIMAL))

      IF @CurrentPage = @EndPageIndex
        BEGIN
            SET @EndNumber = @RecordCount
        END
      --step 5: Get sorted id of current page -----------------------------------------           
      ;WITH a
           AS (SELECT TOP (@EndNumber - @StartNumber) id,
                                                      rownumber
               FROM   (SELECT TOP (@EndNumber) id,
                                               rownumber
                       FROM   @RowNumberTable) AS b
               ORDER  BY rownumber DESC)
      --step 6: Return current page idList -------------------------------------------------------        
      SELECT [ID],
             [GroupID] [Name],
             [Address]
      FROM   dbo.test sm WITH(nolock)
             INNER JOIN a
               ON a.id = sm.id
      ORDER  BY a.rownumber

      -- step 7:return current page & record count ----------------------------------  
      SELECT @CurrentPage AS currentpage,
             @RecordCount AS recordcount
  END

2,简单条件的,动态where语句(关于Like查询的动态where,建议使用笨办法做)

CREATE PROC [dbo].[Getstudentlistbycondition] @Name  NVARCHAR(20),
                                              @Class INT
AS
  SET nocount ON 
  BEGIN
      BEGIN
          SELECT [Name],
                 [class]
          FROM   [testtable]
          WHERE  [Class] = CASE
                             WHEN @Class > 0 THEN @Class ELSE [Class] END
                 AND [name] = CASE
                                WHEN @Name <> '' THEN @Name ELSE [Name] END
      END
  END