100分求存储过程分页及vs2005中调用代码C#,VB不限
程序到正确就给分xudongna@hotmail.com
视图是用来显示数据,存储过程用来显示符合综合查询条件的信息,试图和存储过程的数据需要分页
程序利用了TableAdapter控件,我做分页的主要目的是因为数据量超过万从头到尾便利一次太慢,数据表如下
社员表
部门表
社员视图
视图是用来显示数据,存储过程用来显示符合综合查询条件的信息,试图和存储过程的数据需要分页
程序利用了TableAdapter控件,我做分页的主要目的是因为数据量超过万从头到尾便利一次太慢,数据表如下
社员表
use TEST
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[M_USER]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [M_USER]
GO
CREATE TABLE [M_USER] (
[USERCD] [int] NOT NULL ,
[PASSWD] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,
[NM] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[KANA] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[AGE] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[SECTIONCD] [varchar] (3) COLLATE Chinese_PRC_CI_AS NULL ,
[TEL] [varchar] (15) COLLATE Chinese_PRC_CI_AS NULL ,
[EMAIL] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[REG_DT] [datetime] NULL CONSTRAINT [DF_reday] DEFAULT ('2008-08-08'),
[UP_DT] [datetime] NULL CONSTRAINT [DF_upday] DEFAULT (getdate()),
CONSTRAINT [PK_M_USER] PRIMARY KEY CLUSTERED
(
[USERCD]
) ON [PRIMARY]
) ON [PRIMARY]
GO
部门表
if exists (select * from dbo.sysobjects where id = object_id(N'[M_SECTION]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [M_SECTION]
GO
CREATE TABLE [M_SECTION] (
[SECTIONCD] [varchar] (3) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SECTIONNM] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
CONSTRAINT [PK_M_SECTION] PRIMARY KEY CLUSTERED
(
[SECTIONCD]
) ON [PRIMARY]
) ON [PRIMARY]
GO
社员视图
]--初期化データー
CREATE VIEW dbo.UserInfoView
AS
SELECT M_USER.USERCD as ユーザーコード, M_USER.PASSWD as パスワード, M_USER.NM as 名称, M_USER.KANA as カナ, M_USER.AGE as 年齢,M_SECTION.SECTIONNM as 部署,M_USER.TEL as 電話番号, M_USER.EMAIL as Email, M_USER.REG_DT as 作成日, M_USER.UP_DT as 更新日
FROM M_USER INNER JOIN M_SECTION
ON M_USER.SECTIONCD = M_SECTION.SECTIONCD
[/code
综合联合查询存储过程
[code=SQL]drop PROCEDURE UserSelectProcedure
--UserSelectProcedure
CREATE PROCEDURE UserSelectProcedure
@userid nvarchar(5),@usernm nvarchar(30),@userage nvarchar(3),@usersecid nvarchar(3),@usertel nvarchar(15),@useremail nvarchar(50),@userredt1 nvarchar(10),@userredt2 nvarchar(10),@userupdt1 nvarchar(10),@userupdt2 nvarchar(10)
AS
SELECT M_USER.USERCD as ユーザーコード, M_USER.PASSWD as パスワード, M_USER.NM as 名称, M_USER.KANA as カナ, M_USER.AGE as 年齢,M_SECTION.SECTIONNM as 部署,M_USER.TEL as 電話番号, M_USER.EMAIL as Email, M_USER.REG_DT as 作成日, M_USER.UP_DT as 更新日 FROM M_USER INNER JOIN M_SECTION ON M_USER.SECTIONCD = M_SECTION.SECTIONCD
WHERE ( (M_USER.USERCD like '%'+@userid+'' or M_USER.USERCD like '%'+@userid+'%')
and (M_USER.NM like '%'+@usernm+'%')
and (M_USER.AGE like '%'+@userage+'%' or AGE = ''+@userage+'')
and (M_USER.SECTIONCD=M_SECTION.SECTIONCD)
and (M_USER.SECTIONCD like '%'+@usersecid+'%')
and (M_USER.TEL like ''+@usertel+'%' or M_USER.TEL like '%'+@usertel+'%')
and (M_USER.EMAIL like '%'+@useremail+'%')
and ((M_USER.REG_DT between ''+@userredt1+'' and ''+@userredt2+'' or (M_USER.REG_DT >= ''+@userredt1+'' and M_USER.REG_DT like '%'+@userredt2+'%')) or (M_USER.REG_DT like '%'+@userredt1+'%' and M_USER.REG_DT like '%'+@userredt2+'%'))
and ((M_USER.UP_DT between ''+@userupdt1+'' and ''+@userupdt2+'' or (M_USER.UP_DT >=''+@userupdt1+'' and M_USER.REG_DT like '%'+@userupdt2+'%')) or (M_USER.UP_DT like '%'+@userupdt1+'%' and M_USER.UP_DT like '%'+@userupdt2+'%')))
order by M_USER.USERCD
...全文
请发表友善的回复…
发表回复
lovedona 2008-12-23
- 打赏
- 举报
高手们有事件的话帮我看看阿~~~
lovedona 2008-12-15
- 打赏
- 举报
首先谢谢楼上的哥哥给我的代码,这样的代码其实我现在也有很多份了,可是我现在就是不能把它用到我的程序里面,所以才发了这个帖子。
如果是自己用的代码的话希望楼下的朋友也不要给我贴了好吗?我都已经把自己的表放在上面了,还有最重要的是调用的代码,应为我的程序用了TableAdapter控件所以即使你们给我的代码是针对我的数据表做的我也需要改成控件的参数才能用,所以拜托真正想帮我的人彻底帮帮我好吗?拜托拜托了,我很需要。。。
如果是自己用的代码的话希望楼下的朋友也不要给我贴了好吗?我都已经把自己的表放在上面了,还有最重要的是调用的代码,应为我的程序用了TableAdapter控件所以即使你们给我的代码是针对我的数据表做的我也需要改成控件的参数才能用,所以拜托真正想帮我的人彻底帮帮我好吗?拜托拜托了,我很需要。。。
HDNGO 2008-12-15
- 打赏
- 举报
234接一起就是存储过程了~
HDNGO 2008-12-15
- 打赏
- 举报
SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
+ CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1
IF @RecorderCount = 0
BEGIN
EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
@TotalCount OUTPUT,@TotalPageCount OUTPUT
END
ELSE
BEGIN
SELECT @TotalCount = @RecorderCount
END
IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
BEGIN
SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)
END
IF @PageIndex = 1 OR @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)
BEGIN
IF @PageIndex = 1 --返回第一页数据
BEGIN
SET @Sql = 'SELECT * FROM (SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
+ @TableName + @new_where1 + @new_order1 +') AS TMP ' + @new_order1
END
IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) --返回最后一页数据
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('
+ 'SELECT TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))
+ ' ' + @FieldList + ' FROM '
+ @TableName + @new_where1 + @new_order2 + ' ) AS TMP '
+ @new_order1
END
END
ELSE
BEGIN
IF @SortType = 1 --仅主键正序排序
BEGIN
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
+ @TableName + @new_where2 + @PrimaryKey + ' > '
+ '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
+ ' FROM ' + @TableName
+ @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1
END
ELSE --反向检索
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('
+ 'SELECT TOP ' + STR(@PageSize) + ' '
+ @FieldList + ' FROM '
+ @TableName + @new_where2 + @PrimaryKey + ' < '
+ '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
+ STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey
+ ' FROM ' + @TableName
+ @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2
+ ' ) AS TMP ' + @new_order1
END
END
IF @SortType = 2 --仅主键反序排序
BEGIN
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
+ @TableName + @new_where2 + @PrimaryKey + ' < '
+ '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
+' FROM '+ @TableName
+ @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1
END
ELSE --反向检索
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('
+ 'SELECT TOP ' + STR(@PageSize) + ' '
+ @FieldList + ' FROM '
+ @TableName + @new_where2 + @PrimaryKey + ' > '
+ '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
+ STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey
+ ' FROM ' + @TableName
+ @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2
+ ' ) AS TMP ' + @new_order1
END
END
IF @SortType = 3 --多列排序,必须包含主键,且放置最后,否则不处理
BEGIN
IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0
BEGIN PRINT('ERR_02') RETURN END
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2 --正向检索
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
+ 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
+ ' SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList
+ ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '
+ @new_order2 + ' ) AS TMP ' + @new_order1
END
ELSE --反向检索
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
+ 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
+ ' SELECT TOP ' + STR(@TotalCount-@PageSize *@PageIndex+@PageSize) + ' ' + @FieldList
+ ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '
+ @new_order1 + ' ) AS TMP ' + @new_order1
END
END
END
PRINT(@SQL)
EXEC(@Sql)
GO
HDNGO 2008-12-15
- 打赏
- 举报
SET NOCOUNT ON
IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0
SET @Order = RTRIM(LTRIM(@Order))
SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))
SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','')
WHILE CHARINDEX(', ',@Order) > 0 OR CHARINDEX(' ,',@Order) > 0
BEGIN
SET @Order = REPLACE(@Order,', ',',')
SET @Order = REPLACE(@Order,' ,',',')
END
IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''
OR ISNULL(@PrimaryKey,'') = ''
OR @SortType < 1 OR @SortType >3
OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
BEGIN
PRINT('ERR_00')
RETURN
END
IF @SortType = 3
BEGIN
IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC')
BEGIN PRINT('ERR_02') RETURN END
END
DECLARE @new_where1 VARCHAR(1000)
DECLARE @new_where2 VARCHAR(1000)
DECLARE @new_order1 VARCHAR(1000)
DECLARE @new_order2 VARCHAR(1000)
DECLARE @new_order3 VARCHAR(1000)
DECLARE @Sql VARCHAR(8000)
DECLARE @SqlCount NVARCHAR(4000)
IF ISNULL(@where,'') = ''
BEGIN
SET @new_where1 = ' '
SET @new_where2 = ' WHERE '
END
ELSE
BEGIN
SET @new_where1 = ' WHERE ' + @where
SET @new_where2 = ' WHERE ' + @where + ' AND '
END
IF ISNULL(@order,'') = '' OR @SortType = 1 OR @SortType = 2
BEGIN
IF @SortType = 1
BEGIN
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC'
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC'
END
IF @SortType = 2
BEGIN
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC'
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC'
END
END
ELSE
BEGIN
SET @new_order1 = ' ORDER BY ' + @Order
END
IF @SortType = 3 AND CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0
BEGIN
SET @new_order1 = ' ORDER BY ' + @Order
SET @new_order2 = @Order + ','
SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')
SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')
SET @new_order2 = ' ORDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)
IF @FieldList <> '*'
BEGIN
SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')
SET @FieldList = ',' + @FieldList
WHILE CHARINDEX(',',@new_order3)>0
BEGIN
IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0
BEGIN
SET @FieldList =
@FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))
END
SET @new_order3 =
SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))
END
SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))
END
END
HDNGO 2008-12-15
- 打赏
- 举报
CREATE PROC P_viewPage
/*
nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7 QQ:34813284
敬告:适用于单一主键或存在唯一值列的表或视图
ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围
*/
@TableName VARCHAR(200), --表名
@FieldList VARCHAR(2000), --显示列名,如果是全部字段则为*
@PrimaryKey VARCHAR(100), --单一主键或唯一值键
@Where VARCHAR(2000), --查询条件 不含'where'字符,如id>10 and len(userid)>9
@Order VARCHAR(1000), --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc
--注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷
@SortType INT, --排序规则 1:正序asc 2:倒序desc 3:多列排序方法
@RecorderCount INT, --记录总数 0:会返回总记录
@PageSize INT, --每页输出的记录数
@PageIndex INT, --当前页数
@TotalCount INT OUTPUT , --记返回总记录
@TotalPageCount INT OUTPUT --返回总页数
AS
wuyq11 2008-12-15
- 打赏
- 举报
参考
http://www.cnblogs.com/84ww/archive/2008/05/11/1192346.html
http://www.cnblogs.com/JemBai/archive/2008/11/04/1249584.html
http://www.cnblogs.com/84ww/archive/2008/05/11/1192346.html
http://www.cnblogs.com/JemBai/archive/2008/11/04/1249584.html