使用Webdiyer(陕北吴旗娃)提供的分页控件中分页存储过程中出现的问题
这个分页存储过程有时得不到正确的结果,
应该是SET ROWCOUNT @PageUpperBound影响到了函数dbo.f_GetFirstPy的内部。
例如如果@PageSize>=27,基本就没有问题了。
也就是说这个存储过程如果使用的函数中使用了select就可能出现问题。
该怎么消除set rowcount对内部函数f_GetFirstPy的影响呢?
这个分页存储过程该如何修改?请高手指点。
分页的存储过程如下:
CREATE PROC sp_Mfr_GetByPage
@FirstName varchar(1),
@PageSize int = 0,
@PageIndex int = 0,
@DoCount bit = 1,
@UserIDint
AS
SET NOCOUNT ON
IF ( @DoCount = 1 )
BEGIN
IF @FirstName = ''
SELECT COUNT(ID) FROM BIMS_Mfr WHERE Visible = 1 AND OperatorID IN (SELECT * FROM f_Auth_User_GetJunior (@UserID))
ELSE
SELECT COUNT(ID) FROM BIMS_Mfr WHERE Visible = 1 AND OperatorID IN (SELECT * FROM f_Auth_User_GetJunior (@UserID)) AND dbo.f_GetFirstPy(BossName) = @FirstName
END
ELSE
BEGIN
DECLARE @IndexTable TABLE (ID int IDENTITY(1,1), NID int)
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
SET @PageLowerBound=(@PageIndex-1)*@PageSize
SET @PageUpperBound=@PageLowerBound+@PageSize
SET ROWCOUNT @PageUpperBound
IF @FirstName = ''
INSERT INTO @IndexTable (NID) SELECT [ID] FROM BIMS_Mfr WHERE Visible = 1 AND OperatorID IN (SELECT * FROM f_Auth_User_GetJunior (@UserID)) ORDER BY ShowOrder ASC,ID ASC
ELSE
INSERT INTO @IndexTable (NID) SELECT [ID] FROM BIMS_Mfr WHERE Visible = 1 AND OperatorID IN (SELECT * FROM f_Auth_User_GetJunior (@UserID)) AND dbo.f_GetFirstPy(BossName) = @FirstName ORDER BY ShowOrder ASC,ID ASC
SELECT a.ID, a.BossName,a.ShowOrder,(SELECT RealName FROM BIMS_Auth_Staff WHERE UserID = a.OperatorID ) AS OperatorName, a.OperatorID, a.Name FROM BIMS_Mfr a, @IndexTable b WHERE a.ID = b.NID
AND b.ID > @PageLowerBound and b.ID<=@PageUpperBound ORDER BY b.ID
END
SET NOCOUNT OFF
GO
这其中用到了函数dbo.f_GetFirstPy提取BossName中文名的首字母
function f_GetFirstPy(@str varchar(50)='')
returns char(1)
as
begin
declare @n int, @c char(1), @chn nchar(1)
select @n=63, @chn=substring(@str,1,1)
if @chn > 'z'
select @n = @n +1
,@c = case chn when @chn then char(@n) else @c end
from(
select top 27 * from (
select chn = '吖'
union all select '八'
union all select '嚓'
union all select '咑'
union all select '妸'
union all select '发'
union all select '旮'
union all select '铪'
union all select '丌' --because have no 'i'
union all select '丌'
union all select '咔'
union all select '垃'
union all select '嘸'
union all select '拏'
union all select '噢'
union all select '妑'
union all select '七'
union all select '呥'
union all select '仨'
union all select '他'
union all select '屲' --no 'u'
union all select '屲' --no 'v'
union all select '屲'
union all select '夕'
union all select '丫'
union all select '帀'
union all select @chn) as a
order by chn COLLATE Chinese_PRC_CI_AS
) as b
else
set @c = ''
return (@c)
end
问题点数:100、回复次数:22Top
1 楼postfix2(风间真)回复于 2005-07-09 13:23:35 得分 0
解铃还要系铃人。....................Top
2 楼lr2651(戎 The Two Towers)回复于 2005-07-09 13:29:24 得分 0
同意,问吴老大吧,给他发个消息Top
3 楼codeangel(http://www.wSoft.Net)回复于 2005-07-09 14:06:02 得分 0
没用过他的,不好意思Top
4 楼fancyf(凡瑞)回复于 2005-07-09 14:37:23 得分 0
分页存储过程写法很多,webdiyer.com上就提供了好几种分页存储过程,既然ROWCOUNT影响了里面其他的select语句,那么换一种不用ROWCOUNT的分页存储过程就行了Top
5 楼pwqzc(吴旗娃徒也~~老鼠粮仓之路)回复于 2005-07-09 17:05:33 得分 0
等下啊,你不要急,俺兄回老家趟
过几天他会给你很满意的回答的!!Top
6 楼xyuncn(晓云)回复于 2005-07-09 20:36:42 得分 0
这种比较简单了,另外有两种,其中一种也用到了set rowcount,另外一种复杂了点。Top
7 楼zhilunchen(他山居士)回复于 2005-07-09 21:12:20 得分 0
老大,试试下面这个,其中@PageIndex是页索引号,如第一页就是0;@PageSize是页大小,就是页的记录条数,@Order是排序方式,''表示正序,'desc'表示逆序,当然这个存储可以传入表名改写为更通用的分页存储过程:
create procedure eosp_PagebdEmpInfo
(
@PageIndex int,
@PageSize int,
@Order varchar(10)
)
as
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound = @PageSize * @PageIndex
set @PageUpperBound = @PageLowerBound + @PageSize + 1
create table #PageIndex
(
IndexId int identity (1, 1) not null,
fEmpID Int
)
if(@Order='')
begin
insert into #PageIndex (fEmpID)
select fEmpID from bdEmpInfos order by fEmpID
end
else
begin
insert into #PageIndex (fEmpID)
select fEmpID from bdEmpInfos order by fEmpID desc
end
select count(fEmpID) from bdEmpInfos
select O.*
from bdEmpInfos O,#PageIndex PageIndex
where O.fEmpID = PageIndex.fEmpID AND
PageIndex.IndexID > @PageLowerBound AND
PageIndex.IndexID < @PageUpperBound
order by PageIndex.IndexID
GO
Top
8 楼xyuncn(晓云)回复于 2005-07-09 21:42:50 得分 0
select count(fEmpID) from bdEmpInfos
每次都计算一下,对性能影响不小啊Top
9 楼xyuncn(晓云)回复于 2005-07-09 21:44:49 得分 0
还要把所有数据重插入临时表,这个对性能影响太大了。。。。。Top
10 楼zeusvenus()回复于 2005-07-09 22:07:58 得分 0
发论坛消息问问Webdiyer,他经常上CSDN的.Top
11 楼xyuncn(晓云)回复于 2005-07-10 10:18:43 得分 0
upTop
12 楼zhilunchen(他山居士)回复于 2005-07-10 12:50:44 得分 0
在服务器端执行,问题不大的,这个存储过程返回两个结果集,第一个表示记录总数,第二才是实际的页数据Top
13 楼xyuncn(晓云)回复于 2005-07-11 09:37:16 得分 0
再up一下Top
14 楼xyuncn(晓云)回复于 2005-07-12 09:01:18 得分 0
吴大哥呢
看来只能改分页方式了。Top
15 楼pwqzc(吴旗娃徒也~~老鼠粮仓之路)回复于 2005-07-13 08:28:04 得分 0
不好意思啊
我兄在老家休假几天
很快就会来回答你问题的啊
不要急啊Top
16 楼webdiyer(.net资源精华—www.dotneturls.com)回复于 2005-07-13 10:58:40 得分 100
我的那个存储过程中用set rowcount是为了提高获取数据时的性能(不用每次都获取全部数据再填充临时表),如果它影响你的函数,你可以把它去掉试试,这个语句不影响存储过程的结果,只是性能。Top
17 楼xyuncn(晓云)回复于 2005-07-13 14:08:15 得分 0
ok,谢谢了
不过你设置了set rowcount后,我感觉是不是应该set rowcount = 0?
Top
18 楼webdiyer(.net资源精华—www.dotneturls.com)回复于 2005-07-14 20:34:15 得分 0
不能set rowcount = 0,这样就一条记录也选不出来了Top
19 楼pwqzc(吴旗娃徒也~~老鼠粮仓之路)回复于 2005-07-18 09:09:15 得分 0
怎么还不结帐啊>Top
20 楼xyuncn(晓云)回复于 2005-08-05 17:46:18 得分 0
对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句,忽略 SET ROWCOUNT 选项设置。
若要关闭该选项(以便返回所有的行),请将 SET ROWCOUNT 指定为 0。
Top
21 楼xyuncn(晓云)回复于 2005-08-05 17:47:58 得分 0
我的意思是select后再set rowcount=0
否则是不是可能影响其他的存储过程,或同一存储过程中的其他selectTop
22 楼RoninBlade(RoninBlade)回复于 2005-09-01 16:25:32 得分 0
markTop




