存储过程分页建立内存表的问题. 50ai_ni]

发布时间:2016-12-8 6:13:22 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"存储过程分页建立内存表的问题. 50ai_ni]",主要涉及到存储过程分页建立内存表的问题. 50ai_ni]方面的内容,对于存储过程分页建立内存表的问题. 50ai_ni]感兴趣的同学可以参考一下。

我写了一个内存表分页,为了有更好的拓展性,[email protected],@where等条件,分页的思路就是新建一个内存表,[email protected],[email protected]@table的显示..问题来了,怎么样在存储过程中新建内存表,下面的存储过程执行成功,但调用的时候提示 必须声明变量 [email protected]'。 请各位帮我出出主意,分不够我再开帖奉上..谢谢了. if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pagingShow]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[pagingShow] GO /** 内存表分页 */ create proc dbo.pagingShow --表名. @table varchar(50), [email protected] @id varchar(50), --页容量 @PageSize INT = 20, --当前页 @PageIndex INT = 1, --是否计算记录总条数,为1则计算,并返回总条数;为0则不返回,继续分页操作. @DoCount BIT = 0, --查询条件. @where varchar(255) = '' AS --组建SQL语句 declare @strSQL varchar(5000) -- 主语句 SET NOCOUNT ON IF @DoCount = 1 BEGIN IF @where = '' BEGIN set @strSQL = 'SELECT COUNT([email protected]+') AS CT FROM [[email protected]+']' END ELSE BEGIN set @strSQL = 'SELECT COUNT([email protected]+') AS CT FROM [[email protected]+'] where '+ @where END exec(@strSQL) END ELSE BEGIN DECLARE @PageLowerBound INT, @PageUpperBound INT exec('declare @Temp table (tid INT identity(1,1) PRIMARY KEY, nid VARCHAR(20))') SET @PageLowerBound = (@PageIndex - 1) * @PageSize SET @PageUpperBound = @PageLowerBound + @PageSize ----------------------------------------- SET ROWCOUNT @PageUpperBound IF @where != '' BEGIN exec('INSERT INTO @Temp(nid) SELECT [email protected]+' FROM [[email protected]+'] Where [email protected]) ----------------------------------------- exec('SELECT a.* FROM [[email protected]+'] a, @Temp t WHERE ([email protected]+' = t.nid) AND (t.tid > [email protected]+') AND (t.tid <= [email protected]+')') END ELSE BEGIN exec('INSERT INTO @Temp (nid) SELECT [email protected]+' FROM [email protected]) ----------------------------------------- exec('SELECT a.* FROM [[email protected]+'] a, @Temp t WHERE ([email protected]+' = t.nid) AND (t.tid > [email protected]+') AND (t.tid <= [email protected]+')') END END SET NOCOUNT OFF GO SET QUOTED_IDENTIFIER OFF  GO SET ANSI_NULLS ON  GO

@temp 是局部变量, 用表吧 或全局临时表

除非把所有的串一起exec 

exec('declare @Temp table (tid INT identity(1,1) PRIMARY KEY, nid VARCHAR(20))') @Temp 不是变量,是内存表..我用临时表#Temp已经测试成功了,但内存表效率要比临时表高.. 不过楼上说的除非把所有的串一起exec也有道理..谢谢了.

动态SQL里面好像不能用变量表的,只能将声明变量表的语句也写入动态SQL字符串里才行

谢谢楼上的..期待牛人.

@Temp   不是变量,是内存表..我用临时表#Temp已经测试成功了,但内存表效率要比临时表高..  ---- 晕,我错了,内存表?? 这就是表变量

谢谢楼上的好意提醒,我孤陋寡闻了.. 初步存储已经写出来了,测试100W条数据,成功,贴出来分享下. IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[pagingShow]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[pagingShow] GO CREATE PROC dbo.pagingShow --表名. @table VARCHAR(50), [email protected] @id VARCHAR(50), --页容量 @PageSize INT = 20, --当前页 @PageIndex INT = 1, --是否计算记录总条数,为1则计算,并返回总条数;为0则不返回,继续分页操作. @DoCount BIT = 0, --查询条件. @where VARCHAR(255) = '', --排序. @order VARCHAR(255) = '' AS --组建SQL语句 DECLARE @strSQL varchar(5000) -- 主语句 DECLARE @strSQL1 varchar(5000) -- 主语句 SET NOCOUNT ON IF @DoCount = 1 BEGIN SET @strSQL = 'SELECT COUNT([email protected]+') AS CT FROM [[email protected]+']' --带where条件查询 IF @where != '' BEGIN SET @strSQL = @strSQL + ' where [email protected] END --计算总页数 EXEC(@strSQL) END ---------------------------------------------分页----------------------------------------------- ELSE BEGIN DECLARE @PageLowerBound VARCHAR(50), @PageUpperBound VARCHAR(50) SET @strSQL = 'DECLARE @Temp table (tid INT identity(1,1) PRIMARY KEY, nid INT)' SET @PageLowerBound = CAST(((@PageIndex - 1) * @PageSize) AS VARCHAR) SET @PageUpperBound = CAST((@PageLowerBound + @PageSize) AS VARCHAR) ----------------------------------------- SET @strSQL = @strSQL + (' INSERT INTO @Temp(nid) SELECT top [email protected]+' [email protected]+' FROM [[email protected]+']') --带where条件查询 IF @where != '' BEGIN SET @strSQL = @strSQL + (' WHERE [email protected]) END --order by 排序 IF @order != '' BEGIN SET @strSQL = @strSQL + ' ORDER BY [email protected] END SET @strSQL = @strSQL + (' SELECT a.* FROM [[email protected]+'] a,@Temp t WHERE ([email protected]+' = t.nid)  AND (t.tid > [email protected]+') AND (t.tid <= [email protected]+')') EXEC(@strSQL) END SET NOCOUNT OFF GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON  GO

楼主好样的

楼主真的好强啊!!

看了逻辑,效率应该不高: DECLARE @Temp table (tid INT identity(1,1) PRIMARY KEY, nid INT) 这个 PRIMARY KEY 仅仅是主键约束,而没有索引,因为表变量是不支持索引的。 在页数不多的情况下,或许比临时表快,测试100W数据,试试找第5万页以上的看看。 用临时表的方法也不及邹建的方法快。 邹建的方法也仍有优化的地方。

老大的帖子在哪儿呢?

愁死我了 我开始还想内存表是什么呢 。。。

结帖了..谢谢大家关注. 只是个想法,呵呵..

上一篇:传送事务日志_自动删除备份文件 100分,无满意结帖,结帖人chenye111]
下一篇:数据库的实例联结问题 50wuabc0954]

相关文章

相关评论