数据

当前位置:永利皇宫463登录 > 数据 > 一个通用的分页存储过程,通用分页存储过程

一个通用的分页存储过程,通用分页存储过程

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-10-19 23:49

if exists(select * from sys.objects where name='存储过程名称')
drop proc 存储过程名称
go
CREATE proc 存储过程名称
@tableName varchar(8000),          --表名、视图名
@indexCol varchar(50) = 'a.id',      --标识列名(如:比如主键、标识,推荐使用索引列)
@pageSize int = 10,                --页面大小
@pageIndex int = 0,                --当前页
@orderCol varchar(100) = 'a.id desc',--排序 (如:id)
@where varchar(max) = '',         --条件
@columns varchar(500) = '*'        --要显示的列
as
declare @sql varchar(max)
declare @sql2 varchar(max)
declare @where2 varchar(max)

  • 目标

2006年6月14日  作者:meil  博客:meil.livebaby.cn

if @where <> ''
begin
    select @where2 = ' And ' + @where
    select @where = ' Where ' + @where
end
else
    select @where2 = ''

  1. 实现简单的数据库编程
  2. 实现通用的删除功能
  3. 实现通用的修改功能

本文版权归作者meil转载请注明出处 

select @sql = 'Select Top ' + Convert(varchar(10),@pageSize) + ' ' + @columns + ' From ' + @tableName
select @sql2 = @sql + @where
select @sql =  @sql + ' Where ' + '(' + @indexCol + ' Not In (Select Top ' + Convert(varchar(10),  ((@pageIndex-1)*@pageSize)) + ' ' + @indexCol

  • 通用删除和通用修改 实现思路

        这是我项目中使用的一个分页存储过程,具有很强的通用性。配合前台ASP.NET使用50万条数据基本感不到延迟。数据库为SQLServer2000。

  • ' From ' + @tableName + @where +  ' Order by '+ @orderCol +'))'
    select @sql = @sql + @where2
    select @sql = @sql + ' Order by ' + @orderCol
    --获取数据集
    exec (@sql)
    PRINT @sql
    select @sql2 = Replace(@sql2,'Top ' + Convert(varchar(10), @pageSize) + ' ' + @columns, 'count(1)')
    --获取总数据条数
    exec(@sql2)
  1. 普通删除功能

 

GO

    根据某个条件删除某个表信息,通常如:根据主键删除新闻表信息某条数据,根据主键删除用户表某条数据

1. 分页存储过程(源码)

  分析:

CREATE   procedure pagination

    如果要实现通用的删除功能,只需要编写一个存储过程,传入要删除的表名和删除的条件即可,拼接一个sql语句,最后执行这个sql语句,实现通用的删除功能

 @str_sql           varchar(1000) = '*',     -- 执行的SQL 不含Order by 内容  
 @str_orderfield    varchar(255)='''',       -- 排序的字段名 
 @page_size         int = 10,                     -- 页大小 
 @page_index        int = 0,                      -- 页码
 @order_type        int,                           -- 设置排序类型, 非 -1 值则降序 
 @total_count       int   output                 -- 返回记录总数, 非 0 值则返回 
as

  • 通用修改功能实现思路

  1. 普通修改:一个表就需要写一个存储过程去实现修改功能

-- 获取指定页的数据--

declare @strsql   varchar(5000)              -- 主语句
declare @strtmp   varchar(5000)             -- 临时变量
declare @strorder varchar(400)              -- 排序字串
declare @cruRow   int                            -- 当前行号  

--执行总数统计
exec getRowCount @str_sql,@total_count output

set @strtmp =  ' select * from ' +
        '      (select top ' + convert(varchar(10),@page_size) + ' * from ' +
        '         (select top ' + convert(varchar(10),(@page_index + 1) * @page_size)  +' * from '        -- N+1页

--排序方向
if @order_type !=0
 begin
 set @strsql= @strtmp +
       '          order by @str_orderfield asc) a ' +
       '       order by @str_orderfield desc)b' +
              ' order by @str_orderfield asc'
 end
else
 begin
 set @strsql= @strtmp +
       '          order by @str_orderfield desc) a ' +
       '       order by  @str_orderfieldasc)b' +
              ' order by  @str_orderfield desc'
 end

exec (@strsql)

GO


 2. 分页存储过程(源码) 执行中用到的行数统计

create  procedure getRowCount
       @sql    nvarchar(2000),
       @count  int output
as
begin


  分析:

-- 获取数据总行数 --

  declare @tmpsql nvarchar(2000)
  set @tmpsql='select @count=count(*)  from ('+ @sql +') a'

  execute sp_executesql @tmpsql,N'@count int output',@count output
 
end

GO

   是否可以直接将表名,修改的列名,修改的条件作为参数,拼接一个sql语句,最后执行这个sql语句,实现通用的修改功能

  • 执行sql语句

 EXEC(@sql)

通用删除功能如下

-- =============================================
-- Author:        <Author,,Name>
-- Create date: 2014年4月12日 23:04:30
-- Description:    <通用删除>
-- =============================================
CREATE PROCEDURE DelTable]    
    @tablename nvarchar(100),--表名
    @condition nvarchar(200)--查询条件
AS
BEGIN
--拼接sql
    DECLARE @sql nvarchar(1000)
    SET @sql='Delete from '+@tablename+' where '+@condition
    EXEC(@sql)
END

测试打印sql如下
Delete from userinfo where 3

在t-sql界面操作调用格式如下

EXEC DelTable 'userinfo','id=6'

通用修改功能如下

-- =============================================
-- Author:        <Author,,Name>
-- Create date: <2014年4月12日 23:33:39
-- Description:    通用修改
-- =============================================
CREATE PROCEDURE UpdateTable
    @tablename nvarchar(100),
    @columns nvarchar(200),
    @condition nvarchar(500)
AS
BEGIN
    DECLARE @sql nvarchar(1000)
    SET @sql='update '+@tablename+' set '+@columns+' where '+ @condition
    EXEC(@sql)
END
GO

在界面调用如下

EXEC [dbo].[UpdateTable] 'userinfo','age=24','id=1'

通用查询功能如下

-- =============================================
-- Author:        <Author,,Name>
-- Create date: 2014年4月13日 00:07:44
-- Description:    查询
-- =============================================
CREATE PROCEDURE QueryTable 
    @tablename nvarchar(100),
    @column nvarchar(200),
    @condition nvarchar(300)
AS
BEGIN
    DECLARE @sql nvarchar(1000)
    SET @sql='select '+@column+ ' from '+@tablename+' where 1=1'+@condition
    EXEC(@sql)
END
GO

调用

EXEC [dbo].[QueryTable] 'userinfo','*',''

 

本文由永利皇宫463登录发布于数据,转载请注明出处:一个通用的分页存储过程,通用分页存储过程

关键词: