邹建分页存储过程的BUG,谁来改改??!

nutpp 2007-08-16 11:22:04
如主键是Id,查询条件中有一字段名CategoryId,这样用邹建的分页就会把字段CategoryId替换成Categorya.Id,就产生错误了,谁来改改??

====分页存储过程====

ALTER PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@RecordCount int OUTPUT --总记录数
AS
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')'

--如果@RecordCount为NULL值,则计算总记录数(这样设计可以只在第一次计算总记录数,以后调用时,把总记录数传回给存储过程,避免再次计算总记录数,对于不想计算总记录数的处理而言,可以给@RecordCount赋值)
IF @RecordCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @RecordCount=COUNT(1)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
--SET @RecordCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@Where=REPLACE(@Where,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END
...全文
515 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
DBXP 2007-09-08
  • 打赏
  • 举报
回复
发布两个大数据集通用分页存储过程,欢迎大家和我联系共同探讨改进方法,同时我也会及时将更新内容发布在下面的网址
http://www.thinksea.com/thinksea/show.aspx?id=92db4c46-2216-4b24-a72b-aa27fcf82e50
mengmou 2007-08-20
  • 打赏
  • 举报
回复
不用加别名,因为查询语句是这样的
select *
from tab
left join (select * from tab where)
where

一共两个where,在不同的作用域,没必要加别名的。
ldw701 2007-08-20
  • 打赏
  • 举报
回复
mark一下
Limpire 2007-08-19
  • 打赏
  • 举报
回复
BUG原因分析:

@PageCurrent>1 时,如果 @FieldKey 中的列出现在 @Where 条件中,要加别名限定,否则出现列名不明确的错误。

所以存储过程中必须进行别名替换:
  @Where=REPLACE(@Where,@Field,N'a.'+@Field ...
  @Where=REPLACE(@Where,@s,N'a.'+@s) ...
注:@Field 和 @s 是 @FieldKey 中的一个列名。

因此,@FieldKey 中的列在 @Where 条件中出现全匹配的情况,BUG就产生了。楼主遇到的只是两种可能性之一。

第二种可能性更致命,例如(为了简洁这里不加字符界定符):
  @FieldKey=Id
  @Where=abc>'Id003'
最后的执行结果是:
  ... where abc>'a.Id003' ...
这个BUG是不报错的,完全可以执行下去,但是返回的记录集是错的甚至返回空集。


对于第一种可能性,有两种解决方案:
一、@FieldKey 和 @Where 中的字段名,全部用中括号对 [ ] 限定起来。
二、修改存储过程,共三处:
  --其他参数检查及规范
  ...
  ELSE
  SET @Where=N'WHERE ( '+@Where+N')' --1、左边括号“(”后加一个空格
  ...
  --生成主键(惟一键)处理条件
  @Where=REPLACE(@Where,N' '+@Field,N' a.'+@Field), --2、左边加空格替换
  ...
  SELECT @Where=REPLACE(@Where,N' '+@s,N' a.'+@s), --3、左边加空格替换
  ...


第二种可能性的解决方法:扫描整个 @Where 条件串进行语法分析,把字段解析出来,只对字段部分进行替换。
qingniao8 2007-08-17
  • 打赏
  • 举报
回复
mark~
rfq 2007-08-17
  • 打赏
  • 举报
回复
收藏,学习
yuemb369 2007-08-17
  • 打赏
  • 举报
回复
我修改的分页存储过程。
加入:BeginIndex 开始搜索的纪录,如果你想避开前几条数据搜索,赋值给他。
@OrderWhere 自定义排序字符串


/*
-----存储过程分页
-----author:yuemb
*/
CREATE PROCEDURE [dbo].[Proc_SearchBasePlus]
@TableName varchar(1000), -- 表名
@BeginIndex int = 0, ------搜索开始的记录索引
@SelectFieldName varchar(4000)='', -- 要显示的字段名(不要加select)
@StrWhere varchar(4000)='', -- 查询条件(注意: 不要加 where)
@OrderFieldName varchar(255)='', -- 排序索引字段名
@OrderWhere varchar(4000)='', -- 排序附加
@PageSize int=0 , -- 页大小,如果也大小为0,那么将搜索(@iRowCount - @BeginIndex)的记录数
@PageIndex int = 1, -- 页码,页码小于0 时,赋为1
@OrderType int = 0 , -- 设置排序类型, 非 0 值则降序
@iRowCount int=0 output , -- 返回记录总数
@pageCount int=0 output -- 返回记录总数

AS
declare @strSQL nvarchar(4000) -- 主语句
declare @addAnd nvarchar(20) -- 'wher ' + 'and '
declare @strSelect nvarchar(4000) --select 关键字,如果@PageSize=0,那么'select ' ,其他'select top '
declare @strTmp nvarchar(4000) -- 临时变量
declare @strOrder nvarchar(400) -- 排序类型
declare @strRowCount nvarchar(4000) -- 用于查询记录总数的语句

set @BeginIndex = @BeginIndex -1
set @OrderFieldName=lower(ltrim(rtrim(@OrderFieldName)))
set @SelectFieldName=lower(ltrim(rtrim(@SelectFieldName)))

if @BeginIndex<1
BEGIN
set @BeginIndex=0
END


if @SelectFieldName = '' --------------如果@PageIndex 应大于 0
begin
set @SelectFieldName = ' * '
end
if @PageIndex <= 0 or @PageIndex = null --------------如果@PageIndex 应大于 0
begin
set @PageIndex = 1
end
declare @oddindex int
set @oddindex = charindex(',',@OrderFieldName)
if @oddindex > 0
begin
set @OrderFieldName=left(@OrderFieldName,@oddindex-1)
end

if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @OrderFieldName +' desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @OrderFieldName +' asc'
end
if @OrderFieldName = '' ------------- @OrderFieldName为空,那么 不存在 order 不要 子句
begin
set @strOrder = ' '
end
---------------------获取总记录数------------------------------
if @strWhere!=''
begin
set @strRowCount = ' select @iRowCount=count(*) from ' + @tableName+' where '+ ' (' + @strWhere + ') '
end
else
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tableName
end


exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount output ----------------获取从总记录数
print '@iRowCount=' + str(@iRowCount)
------------------------------------------------------------------------
---------------------------------
if @iRowCount < @BeginIndex
begin
set @strSQL = 'select top 0 ' + @SelectFieldName +' from ' + @TableName
goto end_pro
end
--------------------------------
if @PageSize = 0 or @PageSize = null --------------如果pazesize为 0 或 空 ,那么属于不分页的情况,只需提取从@BeginIndex开始的部分,@PageSize
begin
set @strSelect = 'select '
set @PageIndex = 1
end
else
begin
set @strSelect = 'select top ' + str(@PageSize)
end

if (@BeginIndex > 0) and (@OrderFieldName='newid()') or (@OrderFieldName='') and (@PageSize = 0)
begin
if (@iRowCount>=@BeginIndex)
begin
set @strSelect = 'select top ' + str(@iRowCount-@BeginIndex) +' '
end
end

if(@PageIndex = 1 and @BeginIndex = 0) or (@OrderFieldName='newid()') or (@OrderFieldName='') --------------min,max函数体内的select关键字,如果 @pageindex和@BeginIndex 都为0或者by newid()(*随机抽取*),那么不存在<或>小于子句,
begin
set @strSQL = @strSelect+ ' ' + @SelectFieldName+' from '
+ @tableName
set @addAnd = ' where '
end
else
begin
set @strSQL = @strSelect + ' ' + @SelectFieldName+' from '
+ @tableName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (' + 'select top ' + str((@PageIndex-1)*@PageSize+ @BeginIndex)
+ ' ' + @OrderFieldName + ' from ' + @tableName
if @strWhere != ''
begin
set @strSQL = @strSQL + ' where ' + ' (' + @strWhere + ') '
end
SET set @strSQL = @strSQL + @strOrder + ') as tblTmp) '
set @addAnd = ' and '
end

if @strWhere != '' -------------如果where子句不为空,加入
begin
set @strSQL = @strSQL + @addAnd + ' (' +@strWhere + ') ' + @strOrder
end
else
begin
--------------------------------------加入 order 部分 ----------------------------
set @strSQL = @strSQL + ' ' + @strOrder
end
if ltrim(rtrim(@OrderWhere)) !=''
begin
if ltrim(rtrim(@OrderWhere)) =''
begin
set @OrderWhere= ' order by ' +@OrderWhere
end
else
begin
set @OrderWhere= ',' +@OrderWhere
end
set @strSQL = @strSQL + @OrderWhere
end
----------------------执行语句---------------------------
end_pro:
begin
--------------------@iRowCount - @BeginIndex-----------得到从@BeginIndex开始的记录数,如果小于0,那么赋值为0
set @iRowCount = @iRowCount - @BeginIndex
if @iRowCount<0
begin
set @iRowCount =0
end
----pageCount------
if(@PageSize<>0)
set @pageCount= ceiling(convert(float,@iRowCount)/@PageSize)
else
set @pageCount= 1

--------------------------------------------------------
print '@iRowCount=' + str(@iRowCount)
print 'sql=' + @strSQL
exec sp_executesql @strSQL
end
GO
zp_cool 2007-08-17
  • 打赏
  • 举报
回复
我在web上 实现的是整表显示,可是数据量太多 看的很不美观,想调用这个存储过程来实现分页,不知道web端该怎么做?我用的是jsp
zp_cool 2007-08-17
  • 打赏
  • 举报
回复
是可以执行 而且时间开销也不大,不过想请教下,如果我要在web端实现分页显示,该如何根据这个存储过程来实现分页?
anison 2007-08-16
  • 打赏
  • 举报
回复
mark
mengmou 2007-08-16
  • 打赏
  • 举报
回复
--已修改

CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
-- 用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@PageCount int OUTPUT --总页数
AS
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
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'


--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@Where=REPLACE(@Where,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)


SELECT @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'


--执行查询
select(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END
go

create table a(Id int,CategoryId int)
insert a select 1,2 union all select 2,3
go
declare @PageCount int
exec sp_PageView @tbname = 'a',@FieldKey='Id',@where ='CategoryId in (2,3)',@PageCurrent=1,@PageCount = @PageCount out

go
drop proc sp_PageView
drop table a

Id CategoryId
----------- -----------
1 2
2 3
Limpire 2007-08-16
  • 打赏
  • 举报
回复
Mark
nutpp 2007-08-16
  • 打赏
  • 举报
回复
试试下面这个就知道BUG了

create table a(Id int,CategoryId int)
insert a select 1,2 union all select 2,3
go
declare @PageCount int
exec sp_PageView @tbname = 'a',@FieldKey='Id',@where ='CategoryId in (2,3)',@PageCurrent=2,@PageCount = @PageCount out
go
sp4 2007-08-16
  • 打赏
  • 举报
回复
呵呵,这个东西好久了啊,从来没有用过,更没有测试过,知道其思想足以
mengmou 2007-08-16
  • 打赏
  • 举报
回复
没有bug,我试过

CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
-- 用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@PageCount int OUTPUT --总页数
AS
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
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@Where=REPLACE(@Where,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END
go
create table a(aid int,CategoryId int)
insert a select 1,2 union all select 2,3
go
declare @PageCount int
exec sp_PageView @tbname = 'a',@FieldKey = 'aid,b',@PageCount = @PageCount out
go
drop proc sp_PageView
drop table a

aid CategoryId
----------- -----------
1 2
2 3
nutpp 2007-08-16
  • 打赏
  • 举报
回复
up

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧