分页存储过程多表
1. sqlserver中带分页查询的存储过程返回怎么是三张表,第三个表才是正确的。怎么让它只返回第三张表
将返回的数据表存入DataSet中,然后从DataSet中取第三张表。
DataSet ds = .....
DataTable dt = new DataTable();
dt = ds.Tables[2];
分页还可以用:
with temp as
(select ROW_NUMBER() over( order by 排序的列名)as RowIndex,* from 表名)
select * from temp where RowIndex between 开始行 and 结束行
2. sql 分页存储过程多表怎么写
举例:
查询新闻和新闻分类名称的分页存储过程:
CREATEPROCGetNews
(
@PageIndexINT,--分页索引
@PageSizeINT,--每页显示数据条数
@AllLineINTOUTPUT--总条数
)
AS
BEGIN
SELECT*
FROM(SELECTROW_NUMBER()OVER(ORDERBYNewsOnTopTimeDESC,NewsIDDESC)ASrowindex,
a.*,
b.TypeTitle
FROMNewsa
INNERJOINdbo.NewsTypebONa.TypeId=b.TypeId
)t
WHEREt.rowindexBETWEEN@PageSize*(@PageIndex-1)+1
AND@PageSize*(@PageIndex-1)+@PageSize
SELECT@AllLine=COUNT(1)
FROMNewsa
INNERJOINdbo.NewsTypebONa.TypeId=b.TypeId
END
3. sql server 分页存储过程
CREATE PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' 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) +' '+@strGetFields+ ' from [' + @tblName + ']
where [' + @fldName + ']' + @strTmp + '([' + @fldName + '])
from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' + @fldName + ']
from [' + @tblName + ']
where ' + @strWhere + ' ' + @strOrder + ')
as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec (@strSQL)
GO
/*
-- 需要传递的参数
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
-- 调用测试
exec pagination @tblName='jobs', @strGetFields='job_id,job_desc,min_lvl,max_lvl',
@fldName='job_id',@PageSize=3,@PageIndex=1,
@doCount=0,@OrderType=1,@strWhere=''
*/
============================================
CREATE PROC SP_PageList
@tbname sysname, --要分页显示的表名
@FieldKey sysname, --用于定位记录的主键(惟一键)字段,只能是单个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
--用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@RecordCount int OUTPUT, --总记录数
@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 @RecordCount = @PageCount
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
GO
4. 如何写分页存储过程
create proc 电影存储过程 --翻页存储过程
@PageSize int, --每页面显示数据条数
@PageIndex int, --页面索引
@PageCount int output, --总页数
@名称 nvarchar(100)
as
--查询范围 (@PageSize*@PageIndex+1) 起始行
-- @PageSize*(@PageIndex+1) 结束行
select * from(select Row_Number() over (order by 影片ID) as id, * from(
select * from 电影 where 名称 like '%'+@名称+'%' or 主演 like '%'+@名称+'%' )a )b where id between (@PageSize*@PageIndex+1) and @PageSize*(@PageIndex+1)
--得到数据行数
select @PageCount=count(1) from 电影 where 名称 like '%'+@名称+'%' or 主演 like '%'+@名称+'%'
--计算出总行数
set @PageCount= (@PageCount-1)/@PageSize+1
print @PageCount
这个是我写过的分页存储过程 给你参考下啊!
5. 分页存储过程C# 代码
(1)size每页记录数(2)currIndex当前页(3)count总页数
分页的存储过程:
alter proc Select_Contradict
@qtbid varchar(5),
@qsid varchar(5),
@cid varchar(5),
@title varchar(50),
@htime varchar(50),
@size varchar(5),
@currindex varchar(5)
as
begin
declare @str varchar(700)
declare @where varchar(700)
set @where=''
set @str='select top '+@size+' tt.* from (select qtb.name qtbname,qs.name qsname,c.* from Contradict c inner join QuestionTypeBie qtb on c.qtbid=qtb.qtbid inner join QuestionState qs on c.qsid=qs.qsid) tt where 1=1'
if(@qtbid <> 0) set @where=@where+' and tt.qtbid=convert(int,'+char(39)+@qtbid+char(39)+')'
if(@qsid <> 0) set @where=@where+' and tt.qsid=convert(int,'+@qsid+')'
if(@cid <> 0) set @where=@where+' and tt.id=convert(int,'+@cid+')'
if(@title <> '') set @where=@where+' and tt.title like '+CHAR(39)+'%'+@title+'%'+CHAR(39)
if(@htime <> '') set @where=@where+' and DATEDIFF(DD,tt.HappenTime,'+char(39)+@htime+char(39)+')=0' --以上if为查询条件
set @currindex=@size*(@currindex-1) --筛选掉当前页之前的记录,因top后不能加括号,故这样写
set @where=@where+' and tt.id not in(select top '+@currindex+' tt.id from (select qtb.name qtbname,qs.name qsname,c.* from Contradict c inner join QuestionTypeBie qtb on c.qtbid=qtb.qtbid inner join QuestionState qs on c.qsid=qs.qsid) tt order by tt.id)' --分页的筛选条件
set @where=@where+' order by tt.id' --此order by 的字段需和前面的一致,否则分页效果不对
set @str=@str+@where
print @str
exec (@str)
end
1.select top (1)* from 表 where 条件 and id not in(select top (1)*((2)-1) id from 表 where 条件 order by 排序的字段) order by 排序的字段
2.在展示数据页面添加(1)(2)(3)属性
private int Size = 5;
public int currindex
{
set { ViewState["currindex"] = value; }
get { return Convert.ToInt32(ViewState["currindex"]); }
}
public int count
{
set { ViewState["count"] = value; }
get { return Convert.ToInt32(ViewState["count"]); }
}
3.查询总记录数给临时变量temp
//总个数
private int CountTemp()
{
return new ContradictManager().GetCount();
}
4.获取总页数
private int CountSize()
{
return count = (CountTemp() / Size) + (CountTemp() % Size > 0 ? 1 : 0);
}
5.绑定数据,dataSource=查询方法((1),(2))
6.设置上一页,下一页,(2)需要单击时++或--,执行3,4,5,6
if((2)>=(3)) //下一页不可用
if((2)<=1) //上一页不可用
7.页面首次加载事件:(2)=1;执行3,4,5,6
以上是我以前面试前总结准备的资料,按照这个流程分页绝对能搞定,但你要是看不懂我就没办法了
6. 如何用存储过程分页数据表中的内容
这要看是在一张单表里面分页,还是几张表连接后的分页.
如果是单表的话,存储过程用指针会简单一点
如果是多表的话,个人认为用CTE中的with构造临时新表,就OK啦
7. JSP中如何使用SQL存储过程或JAVA实现分页显示多表查询数据
Java调用
存储过程
CallableStatement
proc
=
null;
proc
=
conn.prepareCall("{
call
SCOTT.TESTA(?,?)
}");
proc.setString(1,
"100");
proc.registerOutParameter(2,
Types.VARCHAR);
proc.execute();
String
testPrint
=
proc.getString(2);
第二个问号是out类型的参数
JAVA实现分页显示多表查询数据?
分页可以使用网络上提供的分页类的做。。
至于多表查询的数据
只是
多张表关联在一起,跟分页没有太大的关系
8. 求一个sql存储过程分页。支持多表联合查询,模糊查询!
可以加个游标 使用更方便
@PageCount bigint output,--总页数
@Pages bigint output --当前页
as
if @Pages<=0 --判断页数
set @Pages=1
declare @指针定位 bigint
set @指针定位=9*(@Pages-1)--这个是每页10条
declare @hid bigint,--获取定位Id 主要是用自增值判断的
@余数 bigint--存余数 这个余数是 记录数/10 余下的数
select @PageCount=count(*) from [表] where [Id] = @Id
set @余数=@PageCount%10 --这里的@PageCount 是记录总数
if @余数>0
set @PageCount=@PageCount/10+1 --这里的@PageCount是总页数
else
set @PageCount=@PageCount/5 --这里的@PageCount是总页数
if @Pages>@PageCount --@Pages是当前页
set @Pages=@PageCount
declare mycur scroll cursor for
select [Id] from [表] where [Id] = @Id
open mycur
fetch absolute @指针定位 from mycur into @hid --@hid获取定位Id
if @hid is null
set @hid=0
SELECT TOP 10 * --这里的10 是指 页数大小
FROM 表
WHERE (Id NOT IN --------在where后面 可以加条件 如where [列1]=2 and (Id NOT IN-----
(SELECT TOP (@hid) Id
FROM 表
ORDER BY Id))
ORDER BY Id
--上面的是我根据下面的 自己改的 我也不确定速度快否 也请高手看看 不过挺好用--
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP (页大小*(页数-1)) id
FROM 表
ORDER BY id))
ORDER BY ID
这是我自己整理的 你仔细看看 很好用的
9. 我想做个分页存储过程,是用sql2000,我现在需要查询两张表的字段做一张分页出来,怎么做好呢
create proc P(@page int=1,@PageCount int=10)
as
select t1.ID,t2.Name,row=identity(int,1,1)
into #
from t1,t2
where t1.ID=t2.t1_id
create clustered index IX_#_row on #(row)
select ID,Name from # where row between (@page-1)*@PageCount+1 and @page*@PageCount
go
10. 求分页存储过程(SQL Server)
exec AbsolutePages 10,1,'有唯一值的列','*','表1 INNER JOIN 表2 ON 表1.字段4=表2.字段5 INNER JOIN 表4 ON 表1.字段6=表4.字段1','条件...',''
CREATE Proc AbsolutePages
(
@PageSize int=10 , --每页显示的记录数
@PageCurrent int=1 , --当前要显示的页号
@FdName varchar(100)='' , --主键名或者标识列名
@SelectStr varchar(2000)='', --select子句,不包含select关键字,如:*或者Id,UserId,UserName等。
@FromStr varchar(1000)='', --from子句,不包含from关键子,如:myTable或者myTable,yourTable
@WhereStr varchar(2000)='', --Where子句,不包含where关键字,如空的,或者 id>2 等
@OrderByStr varchar(1000)='' --order by 子句,不包含order by 子句 ,如id desc,UserId asc 等
)
as
------------------定义局部变量------------------
declare @Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
declare @OrderBySqls varchar(1000) --order by 子句
declare @WhereSqls varchar(2000) --where 子句
declare @Sqls nvarchar(4000) --最终组合成的Sqls语句
declare @TmpStr varchar(2000) --临时语句
------------
if @WhereStr <> ''
set @WhereSqls = ' where ('+@WhereStr+')'
else
set @WhereSqls = ''
------------
if @OrderByStr <> ''
set @OrderBySqls = ' order by '+@OrderByStr
else
set @OrderBySqls = ''
------------
set @TmpStr = @WhereSqls
------------------如果显示第一页,可以直接用top来完成------------------
if @PageCurrent <= 1
begin
select @Id1 = convert(varchar(20),@PageSize)
set @Sqls = 'select top ' + @Id1 + ' ' + @SelectStr + ' from ' + @FromStr + @WhereSqls + @OrderBySqls
exec (@Sqls)
end
else
begin
select @Id1=convert(varchar(20),@PageSize),@Id2=convert(varchar(20),(@PageCurrent-1)*@PageSize)
if @WhereSqls <> ''
set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))'
else
set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')'
----------
set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls
exec (@Sqls)
end
print @Sqls
GO
