一個sql server的存儲過程,傳參調用,實現分頁查詢功能。
比如名字就叫QueryListByPage
USE [DevDB]
GO
/****** Object: StoredProcedure [dbo].[QueryListByPage] Script Date: 2020/1/9 17:43:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--分頁存儲過程
ALTER PROCEDURE [dbo].[QueryListByPage]
@sql varchar(max), --表名、視圖名、查詢語句
@pageIndex bigint=1, --要顯示的頁
@pageSize int=10, --每頁的大小(行數)
@fieldShow VarChar(500), --要顯示的字段列表(爲空列出所有字段)
@orderBy NVarChar(2000), --排序字段列表
@rows bigint OUTPUT, -- 輸出記錄數, 如果@rows爲null, 則輸出記錄數, 否則不要輸出
@param varchar(max) --sql語句中的參數
AS
--declare @strSql varchar(max) -- 主語句
--declare @strTmp varchar(100) -- 臨時變量
--declare @strOrder varchar(400) -- 排序類型
--declare @head VarChar(max)
declare @sqlQuery varchar(max)
if (@fieldShow ='' or @fieldShow is null)
set @fieldShow = '*'
if (@param is null)
set @param = ''
declare @rowsResult nvarchar(max)
declare @sqlCount nvarchar(max)
set @rowsResult = @param + 'select @rows = count(1) from '+ @sql
exec sp_executesql @rowsResult, N'@rows int out', @rows out
declare @startNumber varchar(20)
declare @endNumber varchar(20)
declare @sqlPage nvarchar(max)
set @startNumber = (@pageSize*(@pageIndex-1)) + 1
set @endNumber = (@pageSize*@pageIndex)
set @sqlPage = @sql
set @sqlPage = stuff(@sqlPage,charindex('(SELECT',@sqlPage),7,'(SELECT row_number() over(order by ' + @orderBy + ' ) as row_num,')
set @sqlPage = REPLACE (@sqlPage,')temp' ,')temp where row_num>=' + @startNumber + ' and row_num<=' + @endNumber)
set @sqlQuery = @param + 'with t_rowtable as ( select' + @fieldShow + ' from ' + @sqlPage + ' )
select ' + @fieldShow + ' from t_rowtable'
print @sqlQuery
exec (@sqlQuery)
最終執行的語句:
形如:
with t_rowtable as ( select* from (SELECT row_number() over(order by TableId ) as row_num, * FROM Table1)temp where row_num>=1 and row_num<=10 )
select * from t_rowtable
sql server 調試方法:
親測有效@2020年1月9日
自己隨便搞一個表查一下就知道了。