SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GOALTER PROCEDURE My_Page @TB VARCHAR(1000),
@COL VARCHAR(1000),
-- @COLTYPE INT,
@ORDERBY BIT,
@COLLIST VARCHAR(3000),
@PAGESIZE INT,
@PAGE INT,
@CONDITION VARCHAR(1000),
@IfQueryCount bit,
@RecCount INT OUTPUT,
@PAGES INT OUTPUT,
@OUTSQL NVARCHAR(4000) OUTPUTASDECLARE @SQL NVARCHAR(4000)
DECLARE @WHERE1 VARCHAR(800)
DECLARE @WHERE2 VARCHAR(800)Create table #tmpkeylist
(
pkid int
)IF @CONDITION IS NULL OR RTRIM(@CONDITION) = ''
BEGIN
SET @WHERE1=' WHERE '
SET @WHERE2=' '
END
ELSE
BEGIN
SET @WHERE1=' WHERE ('+@CONDITION+') AND '
SET @WHERE2=' WHERE ('+@CONDITION+') '
END--SET @SQL = 'SELECT @RecCount=COUNT(*),@PAGES=CEILING((+0.0)/'+CAST(@PAGESIZE AS VARCHAR)+') FROM '+@TB+@WHERE2
SET @SQL = 'SELECT @RecCount=COUNT(*),@PAGES=CEILING(COUNT(*)*1.0/'+CAST(@PAGESIZE AS VARCHAR)+') FROM '+@TB+@WHERE2IF(@IfQueryCount=1)
EXEC SP_EXECUTESQL @SQL,N'@PAGES INT OUTPUT,@RecCount INT OUTPUT',@PAGES OUTPUT,@RecCount OUTPUT
ELSE
SELECT @PAGES = 0,@RecCount=0IF @ORDERBY=0
begin
SET @SQL = ' insert into #tmpkeylist(pkid) SELECT TOP '+CAST(@PAGESIZE*(@PAGE-1) AS VARCHAR) + @COL+' FROM '+@TB+@WHERE2+' ORDER BY '+@COL
EXEC(@SQL)
SET @SQL= 'SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE1+@COL+'>(SELECT MAX(pkid) '+' FROM #tmpkeylist) ORDER BY '+@COL
end
ELSE
begin
SET @SQL = 'insert into #tmpkeylist(pkid) SELECT TOP '+CAST(@PAGESIZE*(@PAGE-1) AS VARCHAR) + @COL+' FROM '+@TB+@WHERE2+' ORDER BY '+@COL+' DESC'
EXEC(@SQL)
SET @SQL='SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE1+@COL+'<(SELECT MIN(pkid) '+' FROM #tmpkeylist) ORDER BY '+@COL+' DESC'
endIF @PAGE=1
SET @SQL='SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE2+'ORDER BY '+@COL+CASE @ORDERBY WHEN 0 THEN '' ELSE ' DESC' ENDSET @OUTSQL = @SQLEXEC(@SQL)
drop table #tmpkeylistGO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO-----------------------------------------
调用语句:
SqlParameter[] Params = new SqlParameter[]
{
new SqlParameter("@TB", System.Data.SqlDbType.NVarChar, 1000),
new SqlParameter("@COL", System.Data.SqlDbType.NVarChar, 1000),
new SqlParameter("@ORDERBY", System.Data.SqlDbType.Bit, 5),
new SqlParameter("@COLLIST", System.Data.SqlDbType.NVarChar, 3000),
new SqlParameter("@PAGESIZE", System.Data.SqlDbType.Int, 4),
new SqlParameter("@PAGE", System.Data.SqlDbType.Int, 4),
new SqlParameter("@CONDITION", System.Data.SqlDbType.NVarChar, 1000),
new SqlParameter("@IfQueryCount", System.Data.SqlDbType.Bit, 1),
new SqlParameter("@RecCount", System.Data.SqlDbType.Int, 8),
new SqlParameter("@PAGES", System.Data.SqlDbType.Int, 8),
new SqlParameter("@OUTSQL", System.Data.SqlDbType.NVarChar, 4000)
};
Params[0].Value = TableNameList;
Params[1].Value = KeyColumn;
Params[2].Value = IsDescOrder;
Params[3].Value = ColList;
Params[4].Value = PageSize;
Params[5].Value = PageIndex;
Params[6].Value = Condition;
Params[7].Value = IfQueryCount;
Params[8].Direction = ParameterDirection.Output;
Params[9].Direction = ParameterDirection.Output;
Params[10].Direction = ParameterDirection.Output;
return Params;
--------------------------------------
主要问题
1: 我要当我传入的@PAGES =0 的时候不用分页查出所有记录
2:麻烦帮我注释一下上面的存储过程 越详细越好非常感谢大家
谢谢
GO
SET ANSI_NULLS ON
GOALTER PROCEDURE My_Page @TB VARCHAR(1000),
@COL VARCHAR(1000),
-- @COLTYPE INT,
@ORDERBY BIT,
@COLLIST VARCHAR(3000),
@PAGESIZE INT,
@PAGE INT,
@CONDITION VARCHAR(1000),
@IfQueryCount bit,
@RecCount INT OUTPUT,
@PAGES INT OUTPUT,
@OUTSQL NVARCHAR(4000) OUTPUTASDECLARE @SQL NVARCHAR(4000)
DECLARE @WHERE1 VARCHAR(800)
DECLARE @WHERE2 VARCHAR(800)Create table #tmpkeylist
(
pkid int
)IF @CONDITION IS NULL OR RTRIM(@CONDITION) = ''
BEGIN
SET @WHERE1=' WHERE '
SET @WHERE2=' '
END
ELSE
BEGIN
SET @WHERE1=' WHERE ('+@CONDITION+') AND '
SET @WHERE2=' WHERE ('+@CONDITION+') '
END--SET @SQL = 'SELECT @RecCount=COUNT(*),@PAGES=CEILING((+0.0)/'+CAST(@PAGESIZE AS VARCHAR)+') FROM '+@TB+@WHERE2
SET @SQL = 'SELECT @RecCount=COUNT(*),@PAGES=CEILING(COUNT(*)*1.0/'+CAST(@PAGESIZE AS VARCHAR)+') FROM '+@TB+@WHERE2IF(@IfQueryCount=1)
EXEC SP_EXECUTESQL @SQL,N'@PAGES INT OUTPUT,@RecCount INT OUTPUT',@PAGES OUTPUT,@RecCount OUTPUT
ELSE
SELECT @PAGES = 0,@RecCount=0IF @ORDERBY=0
begin
SET @SQL = ' insert into #tmpkeylist(pkid) SELECT TOP '+CAST(@PAGESIZE*(@PAGE-1) AS VARCHAR) + @COL+' FROM '+@TB+@WHERE2+' ORDER BY '+@COL
EXEC(@SQL)
SET @SQL= 'SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE1+@COL+'>(SELECT MAX(pkid) '+' FROM #tmpkeylist) ORDER BY '+@COL
end
ELSE
begin
SET @SQL = 'insert into #tmpkeylist(pkid) SELECT TOP '+CAST(@PAGESIZE*(@PAGE-1) AS VARCHAR) + @COL+' FROM '+@TB+@WHERE2+' ORDER BY '+@COL+' DESC'
EXEC(@SQL)
SET @SQL='SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE1+@COL+'<(SELECT MIN(pkid) '+' FROM #tmpkeylist) ORDER BY '+@COL+' DESC'
endIF @PAGE=1
SET @SQL='SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE2+'ORDER BY '+@COL+CASE @ORDERBY WHEN 0 THEN '' ELSE ' DESC' ENDSET @OUTSQL = @SQLEXEC(@SQL)
drop table #tmpkeylistGO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO-----------------------------------------
调用语句:
SqlParameter[] Params = new SqlParameter[]
{
new SqlParameter("@TB", System.Data.SqlDbType.NVarChar, 1000),
new SqlParameter("@COL", System.Data.SqlDbType.NVarChar, 1000),
new SqlParameter("@ORDERBY", System.Data.SqlDbType.Bit, 5),
new SqlParameter("@COLLIST", System.Data.SqlDbType.NVarChar, 3000),
new SqlParameter("@PAGESIZE", System.Data.SqlDbType.Int, 4),
new SqlParameter("@PAGE", System.Data.SqlDbType.Int, 4),
new SqlParameter("@CONDITION", System.Data.SqlDbType.NVarChar, 1000),
new SqlParameter("@IfQueryCount", System.Data.SqlDbType.Bit, 1),
new SqlParameter("@RecCount", System.Data.SqlDbType.Int, 8),
new SqlParameter("@PAGES", System.Data.SqlDbType.Int, 8),
new SqlParameter("@OUTSQL", System.Data.SqlDbType.NVarChar, 4000)
};
Params[0].Value = TableNameList;
Params[1].Value = KeyColumn;
Params[2].Value = IsDescOrder;
Params[3].Value = ColList;
Params[4].Value = PageSize;
Params[5].Value = PageIndex;
Params[6].Value = Condition;
Params[7].Value = IfQueryCount;
Params[8].Direction = ParameterDirection.Output;
Params[9].Direction = ParameterDirection.Output;
Params[10].Direction = ParameterDirection.Output;
return Params;
--------------------------------------
主要问题
1: 我要当我传入的@PAGES =0 的时候不用分页查出所有记录
2:麻烦帮我注释一下上面的存储过程 越详细越好非常感谢大家
谢谢
解决方案 »
- 想写一个sql语句,创建和现有数据库中的某个表结构相同但表名不同的临时表,该怎么做?
- 关于数据类型的问题
- 数据库误删除了,连日志文件都删了,有成功恢复的吗
- 如何计算ID号相同的所有数据的money列的和? 高手进来看看
- sql server 的日期转格式。
- 怎样写sql语句,把从表中的记录与主表的记录合并在一起?
- 容易得分的问题 4
- delphi调用sql server,在adodataset的commandtext中写下如下代码:执行后报"ODBC SQL SERVR没有执行可选特性"
- 客户的数据库生成备份文件后,在我的机器上恢复行不行?
- 这种sql看不懂
- SQL Server 2000 无法调试存储过程, 高手指点!!!
- 在sql中怎样样插入“' ”?
select * from(
select *, row=row_number() over(order by 1)
from table
)a where row between (页数 -1) * 每页记录数 + 1 and 页数 * 每页记录数
2000用邹老大这个:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_show]
GOCREATE Proc p_show
@QueryStr nvarchar(4000), --表名、视图名、查询语句
@PageSize int=10, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (4000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
,@Obj_ID int --对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000) --复合主键列表
,@strjoin nvarchar(4000) --连接字段
,@strwhere nvarchar(2000) --查询条件
select @Obj_ID=object_id(@QueryStr)
,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end--如果显示第一页,可以直接用top来完成
if @PageCurrent=1
begin
select @Id1=cast(@PageSize as varchar(20))
exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
return
end--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
select @Id1=cast(@PageSize as varchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
if @@rowcount=0 --如果表中无标识列,则检查表中是否有主键
begin
if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
goto lbusetemp --如果表中无主键,则用临时表处理 select @FdName=name from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
if @@rowcount>1 --检查表中的主键是否为复合主键
begin
select @strfd='',@strjoin='',@strwhere=''
select @strfd=@strfd+',['+name+']'
,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
,@strwhere=@strwhere+' and b.['+name+'] is null'
from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
select @strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
goto lbusepk
end
end
end
else
goto lbusetemp/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity:
exec('select top '+@Id1+@FdShow+' from '+@QueryStr
+' where '+@FdName+' not in(select top '
+@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
+')'+@FdOrder
)
return/*--表中有复合主键的处理方法--*/
lbusepk:
exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
(select top 100 percent * from '+@QueryStr+@FdOrder+') a
left join (select top '+@Id2+' '+@strfd+'
from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
where '+@strwhere+') a'
)
return/*--用临时表处理的方法--*/
lbusetemp:
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
into #tb from'+@QueryStr+@FdOrder+'
select '+@FdShow+' from #tb where '+@FdName+' between '
+@Id1+' and '+@Id2
)GO
参数说明:
1.Tables :表名称,视图
2.PrimaryKey :主关键字
3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
4.CurrentPage :当前页码
5.PageSize :分页尺寸
6.Filter :过滤语句,不带Where
7.Group :Group语句,不带Group ByEXEC Pagination 'CRM_Client','cusCode','LastLinkDate DESC',1,20,
'cusCode,cusName,userId,productId,levelCode,cusProvId,cusCityId,deveStatus,dredgeStat',
' cusNStatus =60 and productId = 30 ',''
***************************************************************/
ALTER PROCEDURE Pagination
(
@Tables varchar(1000),
@PrimaryKey varchar(100),
@Sort varchar(200) = NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields varchar(1000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL,
@total INT OUTPUT
)
AS
BEGIN
/*默认排序*/
IF @Sort IS NULL or @Sort = ''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)
DECLARE @type varchar(100)
DECLARE @prec int
DECLARE @totalSQL nvarchar(200) SET @totalSql= '' IF LEN(@Filter) > 0 BEGIN
SET @totalSQL= 'SELECT @TotalCount=count('+@PrimaryKey+') FROM ' + @Tables+' WHERE ' + @Filter END ELSE BEGIN SET @totalSQL= 'SELECT @TotalCount=count('+@PrimaryKey+') FROM ' + @Tables END
EXEC sp_executesql @totalSQL,N'@TotalCount int=0 output',@total output
/*设定排序语句.*/ IF CHARINDEX('DESC',@Sort)>0 BEGIN SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '<=' END ELSE BEGIN --IF CHARINDEX('ASC', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '>=' END IF CHARINDEX('.', @strSortColumn) > 0 BEGIN SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn)) END ELSE BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END Select @type=t.name, @prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype
Where o.name = @SortTable AND c.name = @SortName IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')' DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)
DECLARE @strFilter varchar(300)
DECLARE @strSimpleFilter varchar(300)
DECLARE @strGroup varchar(100) /*默认当前页*/
IF @CurrentPage < 1
SET @CurrentPage = 1
/*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
/*筛选以及分组语句.*/
IF @Filter IS NOT NULL AND @Filter != '' BEGIN SET @strFilter = ' Where ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' ' END ELSE BEGIN SET @strSimpleFilter = ''
SET @strFilter = '' END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
/*执行查询语句*/
EXEC(
'
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
Select @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
Select ' + @Fields + ' FROM ' + @Tables + ' Where ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' orDER BY ' + @Sort + '
'
)END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO