create PROC proc_Navigation @tableName varchar(100), --要分页显示的表名 @PageCurrent int=1, --要显示的页码 @PageSize int=10, --每页的大小(记录数) @FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段 @FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC,用于指定排序顺序 @Where nvarchar(1000)='', --查询条件 @PageCount int output as SET XACT_ABORT ON -- 打开 try功能 BEGIN TRY --开启事务 begin tran /**//***(游标)获取表主键(多个用逗号分隔)***/ declare @keyName varchar(200) declare @name varchar(200) set @keyName='' declare mycursor cursor for select column_name from information_schema.key_column_usage where table_name = @tableName and constraint_name like 'PK_%' open mycursor fetch mycursor into @name while @@fetch_status<>-1 if @@fetch_status <>-2 begin set @keyName = @keyName + @name +',' fetch mycursor into @name end close mycursor deallocate mycursor set @keyName = subString(@keyName,1,len(@keyName)-1) /**//***设置要显示的字段***/ declare @FieldShow1 varchar(1000) if len(@FieldShow)=0 begin set @FieldShow1 =' * '--输入的要显示的字段为空字符串时,设置为* end else begin set @FieldShow1 = @FieldShow --将要显示的字段名赋值给变量@FieldShow1 end /**//***设置排序字段***/ declare @FieldOrder1 varchar(100) if len(@FieldOrder) =0 begin set @FieldOrder1 ='' end else begin set @FieldOrder1 =' order by '+@FieldOrder end /**//***设置where条件***/ declare @where1 varchar(1000) if len(@Where) =0 begin set @where1 ='' end else begin set @where1 =' where '+@Where end /**//***写分页sql语句***/ declare @startnumber int, --开始行数 @endnumber int, --结束行数 @sql varchar(5000) --分页SQL语句 set @startnumber = (@PageCurrent-1)*@PageSize --根据每行页数和页数设置开始行数 set @endnumber = @PageCurrent*@PageSize --根据每行页数和页数设置结束行数 --主键名 set @sql = 'select * from (select row_number() over(order by '+ @keyName+') row_num,'+ @FieldShow1+' from '+ @tableName+ @where1 +')tablename where row_num > '+ convert(varchar(5),@startnumber)+' and row_num <= '+ convert(varchar(5),@endnumber)+ @FieldOrder1 --设置分页SQL语句 print @sql exec (@sql) /**//***输出参数@PageCount***/ IF @PageCount IS NULL BEGIN DECLARE @text nvarchar(4000) SET @text=N'SELECT @PageCount=COUNT(*) ' +N' FROM '+@tableName +N''+@where1 EXEC sp_executesql @text,N'@PageCount int OUTPUT',@PageCount OUTPUT SET @PageCount=(@PageCount+@PageSize-1)/@PageSize END commit tran --提交事务 print 'commited' END TRY BEGIN CATCH rollback --事务回滚 print 'rolled back' END CATCH go declare @a int exec proc_Navigation 'aa',1,8,'','','',@a output print @a