当前位置:编程学习 > C#/ASP.NET >>

求存储过程分页,送最后100分了。

说实在的,我没学过存储过程,今天在网上看过一些,了解一点点,但是怎么新建,怎么使用,还是很朦胧。
我原本想找个简单易懂的教程看看,但是越看越不懂,可能最近的教程都不是教程了。
不知道谁有基本的入门级教程(而不是那种介绍一大堆废话,没一点用处的),图文跟容易看懂。

至于什么是存储过程,他如何厉害,如何好,如何怎么样,它是怎么工作的。。。。就免了。我学开车,不需要知道怎么制造汽车。当然,我了解过汽车有几个轮子才叫做汽车。

至少包含以下几点:
存储过程是怎么建立的,在哪里建立、怎么建立,基本语法等。
存储过程是怎么在.aspx(C#)中使用的、如何使用,基本语法等。

如果有分页的话。。。。现在想弄这个,以前的方法,觉得不怎么好。

附:网页。 --------------------编程问答-------------------- 车夫 --------------------编程问答-------------------- CREATE PROC 存储过程名称
@参数名   varchar(255),
@参数名    类型
as 
下面就是定平常的SQL代码..可以写多行语句...用GO分批执行...
大概也就是这样...好处也就把多条执行语句放在一起执行..避免注入和权限管理等吧...
--------------------编程问答--------------------
引用 1 楼 shine_fly 的回复:
车夫

这个有代码..直接用就行了... --------------------编程问答--------------------
引用 3 楼 beargo 的回复:
引用 1 楼 shine_fly 的回复:

车夫

这个有代码..直接用就行了...


高人呀!  --------------------编程问答-------------------- 分页有自动的、 那个很方便、   太麻烦了、我也都快忘记了、要不肯定给你写个、以前写过、现在很少用、 --------------------编程问答-------------------- 我不太会. 好像 分页 是 select TOP25   每次25条. 大概这样.一起学习哈 --------------------编程问答-------------------- /*通用分页存储过程*/
USE HotelManagementSystem
GO
IF EXISTS(SELECT * FROM sys.objects WHERE NAME='cndoup_GetPageOfRecords')
  DROP PROCEDURE cndoup_GetPageOfRecords
GO
--创建存储过程
CREATE PROCEDURE cndoup_GetPageOfRecords
  @pageSize int = 20,                                                --分页大小
  @currentPage int ,                                                 --第几页
  @columns varchar(1000) = '*',                            --需要得到的字段 
  @tableName varchar(100),                                     --需要查询的表    
  @condition varchar(1000) = '',                         --查询条件, 不用加where关键字
  @ascColumn varchar(100) = '',                            --排序的字段名 (即 order by column asc/desc)
  @bitOrderType bit = 0,                                         --排序的类型 (0为升序,1为降序)
  @pkColumn varchar(50) = ''                                 --主键名称

AS
BEGIN                                                                                    --存储过程开始
  DECLARE @strTemp varchar(300)
  DECLARE @strSql varchar(5000)                            --该存储过程最后执行的语句
  DECLARE @strOrderType varchar(1000)                --排序类型语句 (order by column asc或者order by column desc)

  BEGIN
    IF @bitOrderType = 1                --降序
      BEGIN
        SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'
        SET @strTemp = '<(SELECT min'
      END
    ELSE                  --升序
      BEGIN
        SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'
        SET @strTemp = '>(SELECT max'
      END

    IF @currentPage = 1            --第一页
      BEGIN
        IF @condition != ''
          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
            ' WHERE '+@condition+@strOrderType
        ELSE
          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+@strOrderType
      END

    ELSE                  -- 其他页
      BEGIN
        IF @condition !=''
          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
          ' WHERE '+@condition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+
          ' '+@pkColumn+' FROM '+@tableName'where'+@condition+@strOrderType+') AS TabTemp)'+@strOrderType
        ELSE
          SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
          ' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+' '+@pkColumn+
          ' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType
      END

  END
  EXEC (@strSql)
END  

  --存储过程结束

--------------------编程问答-------------------- 调用:

     public DataSet GetList(int PageSize, int PageIndex, string strWhere)
        {
            SqlParameter[] parameters = {
     new SqlParameter("@tblName", SqlDbType.VarChar, 255),
     new SqlParameter("@fldName", SqlDbType.VarChar, 255),
     new SqlParameter("@PageSize", SqlDbType.Int),
     new SqlParameter("@PageIndex", SqlDbType.Int),
     new SqlParameter("@IsReCount", SqlDbType.Bit),
     new SqlParameter("@OrderType", SqlDbType.Bit),
     new SqlParameter("@strWhere", SqlDbType.VarChar,1000),
     };
            parameters[0].Value = "Product";
            parameters[1].Value = "ProductID";
            parameters[2].Value = PageSize;
            parameters[3].Value = PageIndex;
            parameters[4].Value = 0;
            parameters[5].Value = 0;
            parameters[6].Value = strWhere;
            return DbHelperSQL.RunProcedure("UP_GetRecordByPage", parameters, "ds");
        }

--------------------编程问答-------------------- 01.--创建临时表   
02.create table #tem2   
03.(   
04.    num int identity(1,1),   
05.    id int,   
06.)   
07.  
08.--创建存储过程   
09.if exists(select name from sys.all_objects    
10.        where name = 'pagingProd' and type = 'P')   
11.        drop procedure pagingProd   
12.go   
13.create procedure pagingProd   
14.    @start int,     --分页开始位置   
15.    @end int,       --分页结束位置   
16.    @table varchar(20)  --表名   
17.as   
18.begin   
19.exec('insert into #tem2 select id from '+@table)   
20.exec('select * from #tem2 t,'+@table+' p   
21.where t.id = p.id and t.num between '+@start+' and '+@end)   
22.end   
23.  
24.--执行存储过程   
25.execute pagingProd 11,15,'product'    
--------------------编程问答--------------------

create procedure XiaoZhengGe 
@sqlstr nvarchar(4000), --查询字符串 
@currentpage int, --第N页 
@pagesize int --每页行数 
as 
set nocount on 
declare @P1 int, --P1是游标的id 
@rowcount int 
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output 
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
set @currentpage=(@currentpage-1)*@pagesize+1 
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
exec sp_cursorclose @P1 
set nocount off 
--------------------编程问答-------------------- 不错,收下了! --------------------编程问答-------------------- SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO



---------------------------------
--用途:分页存储过程(对有主键的表效率极高)  
--说明:
------------------------------------

CREATE     PROCEDURE UP_GetRecordByPage
    @tblName      varchar(255),       -- 表名
    @fldName      varchar(255),       -- 主键字段名
    @PageSize     int = 10,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @IsReCount    bit = 0,            -- 返回记录总数, 非 0 值则返回
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
    @strWhere     varchar(1000) = ''  -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTotal varchar(2000)          -- 获取记录数合计语句
declare @strTmp   varchar(1000)        -- 临时变量
declare @strOrder varchar(400)        -- 排序类型

if @OrderType != 0
begin
    set @strTmp = '<(select min'
    set @strOrder = ' order by [' + @fldName +'] desc'
end
else
begin
    set @strTmp = '>(select  max'
    set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select  top ' + str(@PageSize) + ' * from ['
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
    + @strOrder

if @strWhere != ''
    set @strSQL = 'select  top ' + str(@PageSize) + ' * from ['
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
    set @strTmp =''
    if @strWhere != ''
        set @strTmp = ' where ' + @strWhere
   
    set @strSQL = 'select  top ' + str(@PageSize) + ' * from ['
        + @tblName + ']' + @strTmp + ' ' + @strOrder
    
end

    
if @strWhere != ''
    set @strTotal = 'select  count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere
else
        set @strTotal = 'select  count(*) as Total from [' + @tblName + ']'


exec (@strSQL)
if @IsReCount != 0
exec (@strTotal)



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
  /// <summary>
/// 分页获取数据列表
/// </summary>
        /// ///
    /// <param name="PageSize">记录数</param>
        /// <param name="PageIndex">页码</param>
        /// <param name="strWhere">查询条件</param>
        /// <returns></returns>
        public DataSet GetList(int PageSize,int PageIndex,string strWhere)
{
SqlParameter[] parameters = {
new SqlParameter("@tblName", SqlDbType.VarChar, 255),
new SqlParameter("@fldName", SqlDbType.VarChar, 255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@IsReCount", SqlDbType.Bit),
new SqlParameter("@OrderType", SqlDbType.Bit),
new SqlParameter("@strWhere", SqlDbType.VarChar,1000),
};
parameters[0].Value = "table";  //表名
parameters[1].Value = "ID";     //主键字段
parameters[2].Value = PageSize;  //记录数
parameters[3].Value = PageIndex;  //页码
parameters[4].Value = 0;          //返回记录总数, 非 0 值则返回 
parameters[5].Value = 0;          //设置排序类型, 非 0 值则降序
parameters[6].Value = strWhere;
return DbHelperSQL.RunProcedure("UP_GetRecordByPage",parameters,"ds");
}

--------------------编程问答-------------------- ALTER PROCEDURE [dbo].[Basic_Pagination2005]
@tblName      nvarchar(200),     --表名
@fidlelist    nvarchar(1000),   --要查询字段
@fldName      nvarchar(100),    --排序字段
@PageSize     int,              --页尺寸
@PageIndex    int,              --页码
@IsReCount    bit ,             -- 返回记录总数, 非 0 值则返回
@OrderType    bit,              -- 设置排序类型, 非 0 值则降序
@strWhere nvarchar(1000)        --查询条件
AS
declare @sqlstr nvarchar(4000),
@tmpwhere nvarchar(4000),@tmporder nvarchar(100)
BEGIN
if @OrderType != 0
begin
set @tmporder = @fldName +' desc '
end
else
begin
        set @tmporder = @fldName +' asc '
end
set @tmpwhere='';
if(@strWhere!='')
begin
set @tmpwhere=' where '+@strWhere;
end
set @sqlstr=N'select * from
(select  '+@fidlelist+', ROW_NUMBER() OVER(order

by '+@tmporder+') as row from '+@tblName+@tmpwhere+') 
tmp where row between '+cast

(((@PageIndex-1)*@PageSize+1) as nvarchar)+' and '+cast

(@PageIndex*@PageSize as nvarchar);  
exec sp_executesql @sqlstr
if @IsReCount != 0
begin
set @sqlstr=N'select count(*) as Total from '+ @tblName+@tmpwhere
exec sp_executesql @sqlstr    
end
END --------------------编程问答-------------------- --------------------编程问答-------------------- 上面几个传的都是蛮给力的。LZ直得学习下 --------------------编程问答-------------------- --------------------编程问答--------------------
***只做分页查询用*** 
/** 
*  procedure name : prcPageResult 
*  author : michael 
*  create date : 2009-02-17 
*/ 
create procedure procPageResult 
---获得某一页的数据--- 
@currPage int = 1,   --->当前页页码(即top currPage) 
@showColumn varchar(2000) = '*', --->需要查询的字段(即column1,column2,......) 
@tabName varchar(2000),   --->需要查看的表名(即from table_name) 
@strCondition varchar(2000) = '', --->查询条件(即where condition......) 不用加where关键字 
@ascColumn varchar(100) = '',  --->排序的字段名(即order by column asc/desc) 
@bitOrderType int = 0,   --->排序的类型(0为升序,1为降序) 
@pkColumn varchar(50) = '',  --->主键名称 
@pageSize int = 20   --->分页大小 
as 
begin  --->存储过程开始 
---该存储过程需要用到的几个变量--- 
declare @strTemp varchar(1000) 
declare @strSql varchar(4000)  --->该存储过程最后执行的语句 
declare @strOrderType varchar(1000) --->排序类型语句(order by column asc/desc) 
begin 
if @bitOrderType = 1  --->@bitOrderType = 1 即执行降序 
begin 
    set @strOrderType = ' order by ' + @ascColumn + ' desc' 
    set @strTemp = '<(select min' 
end 
else 
begin 
    set @strOrderType = ' order by ' + @ascColumn + ' asc' 
    set @strTemp = '>(select max' 
end 
if @currPage = 1 --->如果是第一页 
begin 
    if @strCondition != '' 
set @strSql = 'select top ' + str(@pageSize) + ' ' + @showColumn + ' from ' + @tabName + ' where ' + @strCondition + @strOrderType
     else 
set @strSql = 'select top ' + str(@pageSize) + ' ' + @showColumn + ' from ' + @tabName + @strOrderType
 end 
else  --->其他页 
begin 
    if @strCondition != '' 
set @strSql = 'select top ' + str(@pageSize) + ' ' + @showColumn + ' from ' + @tabName + ' where ' + @strCondition + ' and ' +
 @pkColumn + @strTemp + '(' + @pkColumn + ')' + ' from (select top ' + str((@currPage-1)*@pageSize) + ' ' + @pkColumn +
 ' from ' + @tabName + @strOrderType + ') as TabTemp)' + @strOrderType 
    else 
set @strSql = 'select top ' + str(@pageSize) + ' ' + @showColumn + ' from ' + @tabName + ' where ' + @pkColumn + @strTemp +
 '(' + @pkColumn + ')' + ' from (select top ' + str((@currPage-1)*@pageSize) + ' ' + @pkColumn + ' from ' +
 @tabName + @strOrderType + ') as TabTemp)' + @strOrderType 
end 
end 
EXEC (@strSql) 
end --->存储过程结束 
go 
-------------------------------------------------------------------- 
调用方法: 
procPageResult 1,'*','TableName','','CreateDate',1,'PkID',25 
查询表TableName的所有字段的前25条记录,因为是第一页,排序字段为CreateDate,1表示降序排列,主键是PkID。这个存储过程的功能比较强大,用在项目中
 非常的适用。尤其是在百万级数据上,它的优势就显露无疑了。此段代码是转载别人的。 
--------------------------------------------------------------------- 
***查询表记录数*** 
/** 
*  procedure name : procRowsCount 
*  author : michael 
*  create date : 2009-02-17 
*/ 
create procedure procRowsCount 
@tabName varchar(200),  --->需要查询的表名 
@colName varchar(200) = '*', --->需要查询的列名 
@condition varchar(200) = '' --->查询条件 
as 
begin 
    declare @strSql varchar(255) 
    if @condition = '' 
set @strSql = 'select count(' + @colName + ') from ' + @tabName 
    else 
set @strSql = 'select count(' + @colName + ') from ' + @tabName + ' where ' + @condition
     EXEC (@strSql) 
end 
--------------------编程问答-------------------- 服了,看来我的代码就不值一提了,高手云云啊!顺便学习下
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,