zoukankan      html  css  js  c++  java
  • 字符串缓存实现的通用分页存储过程.sql

    CREATE PROC sp_PageView
    @tbname     sysname,            --要分页显示的表名
    @FieldKey   sysname,            --用于定位记录的主键(惟一键)字段,只能是单个字段
    @PageCurrent int=1,              --要显示的页码
    @PageSize   int=10,             --每页的大小(记录数)
    @FieldShow  nvarchar(1000)='',   --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
    @FieldOrder  nvarchar(1000)='',  --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
                                              用于指定排序顺序
    @Where     nvarchar(1000)='',   --查询条件
    @PageCount  int OUTPUT         --总页数
    AS
    DECLARE @sql nvarchar(4000)
    SET NOCOUNT ON
    --检查对象是否有效
    IF OBJECT_ID(@tbname) IS NULL
    BEGIN
     RAISERROR(N'对象"%s"不存在',1,16,@tbname)
     RETURN
    END
    IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
     AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
     AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
    BEGIN
     RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
     RETURN
    END

    --分页字段检查
    IF ISNULL(@FieldKey,N'')=''
    BEGIN
     RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
     RETURN
    END

    --其他参数检查及规范
    IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
    IF ISNULL(@PageSize,0)<1 SET @PageSize=10
    IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
    IF ISNULL(@FieldOrder,N'')=N''
     SET @FieldOrder=N''
    ELSE
     SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
    IF ISNULL(@Where,N'')=N''
     SET @Where=N''
    ELSE
     SET @Where=N'WHERE ('+@Where+N')'

    --如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
    IF @PageCount IS NULL
    BEGIN
     SET @sql=N'SELECT @PageCount=COUNT(*)'
      +N' FROM '+@tbname
      +N' '+@Where
     EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
     SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
    END

    --计算分页显示的TOPN值
    DECLARE @TopN varchar(20),@TopN1 varchar(20)
    SELECT @TopN=@PageSize,
     @TopN1=@PageCurrent*@PageSize 

    --第一页直接显示
    IF @PageCurrent=1
     EXEC(N'SELECT TOP '+@TopN
      +N' '+@FieldShow
      +N' FROM '+@tbname
      +N' '+@Where
      +N' '+@FieldOrder)
    ELSE
    BEGIN
     SELECT @PageCurrent=@TopN1,
      @sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
       +N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
       +N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
       +N' '+@Where
       +N' '+@FieldOrder
     SET ROWCOUNT @PageCurrent
     EXEC sp_executesql @sql,
      N'@n int,@s nvarchar(4000) OUTPUT',
      @PageCurrent,@sql OUTPUT
     SET ROWCOUNT 0
     IF @sql=N''
      EXEC(N'SELECT TOP 0'
       +N' '+@FieldShow
       +N' FROM '+@tbname)
     ELSE
     BEGIN
      SET @sql=STUFF(@sql,1,1,N'')  
      --执行查询
      EXEC(N'SELECT TOP '+@TopN
       +N' '+@FieldShow
       +N' FROM '+@tbname
       +N' WHERE '+@FieldKey
       +N' IN('+@sql
       +N') '+@FieldOrder)
     END
    END

  • 相关阅读:
    trackr: An AngularJS app with a Java 8 backend – Part III
    trackr: An AngularJS app with a Java 8 backend – Part II
    21. Wireless tools (无线工具 5个)
    20. Web proxies (网页代理 4个)
    19. Rootkit detectors (隐形工具包检测器 5个)
    18. Fuzzers (模糊测试器 4个)
    16. Antimalware (反病毒 3个)
    17. Debuggers (调试器 5个)
    15. Password auditing (密码审核 12个)
    14. Encryption tools (加密工具 8个)
  • 原文地址:https://www.cnblogs.com/dushu/p/2509634.html
Copyright © 2011-2022 走看看