求存储过程分页,送最后100分了。
说实在的,我没学过存储过程,今天在网上看过一些,了解一点点,但是怎么新建,怎么使用,还是很朦胧。我原本想找个简单易懂的教程看看,但是越看越不懂,可能最近的教程都不是教程了。
不知道谁有基本的入门级教程(而不是那种介绍一大堆废话,没一点用处的),图文跟容易看懂。
至于什么是存储过程,他如何厉害,如何好,如何怎么样,它是怎么工作的。。。。就免了。我学开车,不需要知道怎么制造汽车。当然,我了解过汽车有几个轮子才叫做汽车。
至少包含以下几点:
存储过程是怎么建立的,在哪里建立、怎么建立,基本语法等。
存储过程是怎么在.aspx(C#)中使用的、如何使用,基本语法等。
如果有分页的话。。。。现在想弄这个,以前的方法,觉得不怎么好。
附:网页。 --------------------编程问答-------------------- 车夫 --------------------编程问答-------------------- CREATE PROC 存储过程名称
@参数名 varchar(255),
@参数名 类型
as
下面就是定平常的SQL代码..可以写多行语句...用GO分批执行...
大概也就是这样...好处也就把多条执行语句放在一起执行..避免注入和权限管理等吧...
--------------------编程问答--------------------
这个有代码..直接用就行了... --------------------编程问答--------------------
高人呀! --------------------编程问答-------------------- 分页有自动的、 那个很方便、 太麻烦了、我也都快忘记了、要不肯定给你写个、以前写过、现在很少用、 --------------------编程问答-------------------- 我不太会. 好像 分页 是 select TOP25 每次25条. 大概这样.一起学习哈 --------------------编程问答-------------------- /*通用分页存储过程*/
USE HotelManagementSystem
GO
IF EXISTS(SELECT * FROM sys.objects WHERE NAME='易做图oup_GetPageOfRecords')
DROP PROCEDURE 易做图oup_GetPageOfRecords
GO
--创建存储过程
CREATE PROCEDURE 易做图oup_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'
--------------------编程问答--------------------
--------------------编程问答-------------------- 不错,收下了! --------------------编程问答-------------------- SET QUOTED_IDENTIFIER ON
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
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#