sql serverストレージ・プロシージャのページング
16131 ワード
Create PROCEDURE [dbo].[Table_GetList]
@WhereStr nvarchar(256) = '', -- ( : WHERE)
@OrderStr nvarchar(128) = '', --
@PageIndex int = 1, --
@PageSize int = 0 , --
@RecordCount int output --
AS
DECLARE @TableName nvarchar(32) --
DECLARE @PriKeyName nvarchar(32) --
DECLARE @FldNames nvarchar(512) -- ,
DECLARE @StrByPage nvarchar(1024) --
DECLARE @StrNoPage nvarchar(512) -- ,
DECLARE @StrTotal nvarchar(512) --
DECLARE @StrNonResult nvarchar(512) --
DECLARE @StrTmp nvarchar(128)
DECLARE @StrOrder nvarchar(128)
DECLARE @TotalPage int
SET @TableName = 'ProductActions as b'
SET @PriKeyName = 'ActionID'
SET @FldNames = 'b.*'
SET @TotalPage = 0
--
IF @OrderStr is null or @OrderStr=''
SET @OrderStr = '1'
IF @OrderStr = '0' --
BEGIN
SET @StrTmp = @PriKeyName + '>(SELECT max([' + @PriKeyName + ']) FROM '
SET @StrOrder = ' order by ' + @PriKeyName + ' asc'
END
ELSE IF @OrderStr = '1' --
BEGIN
SET @StrTmp = @PriKeyName + '<(SELECT min([' + @PriKeyName + ']) FROM '
SET @StrOrder = ' order by ' + @PriKeyName + ' desc'
END
ELSE --
BEGIN
SET @StrTmp = ''
SET @StrOrder = ' order by ' + @OrderStr
END
SET @StrNonResult = 'SELECT ' + @FldNames + ' FROM ' + @TableName + ' WHERE 1=2'
IF @WhereStr is null or @WhereStr = '' --
BEGIN
SET @StrTotal = N'SELECT @RecordCount = count(1) FROM ' + @TableName
SET @StrNoPage = N'SELECT ' + @FldNames + ' FROM ' + @TableName + @StrOrder
END
ELSE
BEGIN
SET @StrTotal = N'SELECT @RecordCount = count(1) FROM ' + @TableName + ' WHERE ' + @WhereStr
SET @StrNoPage = N'SELECT ' + @FldNames + ' FROM ' + @TableName + ' WHERE ' + @WhereStr + @StrOrder
END
--
EXEC sp_EXECuteSql @StrTotal,N'@RecordCount int output',@RecordCount output
-- ,
IF @RecordCount = 0
BEGIN
SET @TotalPage = 0
EXEC sp_EXECuteSql @StrNonResult
RETURN 0
END
-- ,
IF @PageSize = 0 --
BEGIN
SET NOCOUNT ON
SET @TotalPage = 0
EXEC sp_EXECuteSql @StrNoPage
RETURN
END
ELSE --
BEGIN
SET NOCOUNT ON
-- , , 1
SET @TotalPage=CEILING(cast(@RecordCount as float)/@PageSize)
IF(@PageIndex>@TotalPage)
SET @PageIndex=@TotalPage
IF(@PageIndex <1)
SET @PageIndex=1
IF @PageIndex =1 --
BEGIN
IF @WhereStr=''
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames + ' FROM ' + @TableName + @StrOrder
ELSE
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames + ' FROM ' + @TableName + ' WHERE ' + @WhereStr + @StrOrder
END
ELSE --
BEGIN
IF (@OrderStr='0' or @OrderStr='1') --
BEGIN
IF @WhereStr=''
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames
+ ' FROM ' + @TableName
+ ' WHERE ' + @StrTmp
+ ' (SELECT TOP ' + cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @PriKeyName
+ ' FROM ' + @TableName + @StrOrder + ') as tmptbl)'
+ @StrOrder
ELSE
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames
+ ' FROM ' + @TableName
+ ' WHERE ' + @StrTmp
+ ' (SELECT TOP '+ cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @PriKeyName
+ ' FROM ' + @TableName + ' WHERE ' + @WhereStr + @StrOrder + ') as tmptbl)'
+ ' and ' + @WhereStr
+ @StrOrder
END
ELSE --
BEGIN
IF @WhereStr=''
SET @StrByPage = N'WITH cte AS('
+ ' SELECT ROW_NUMBER() OVER('+@StrOrder+') AS ROWNUMBER ,' + @FldNames
+ ' FROM '+ @TableName
+ ') SELECT * FROM cte WHERE ROWNUMBER BETWEEN '
+ CAST(((@PageIndex -1) * @PageSize +1) AS varchar) + ' AND '
+ CAST(@PageIndex * @PageSize AS varchar)
ELSE
SET @StrByPage = N'WITH cte AS('
+ ' SELECT ROW_NUMBER() OVER('+@StrOrder+') AS ROWNUMBER ,' + @FldNames
+ ' FROM '+ @TableName + ' WHERE ' + @WhereStr
+') SELECT * FROM cte WHERE ROWNUMBER BETWEEN '
+ CAST(((@PageIndex -1) * @PageSize +1) AS varchar) + ' AND '
+ CAST(@PageIndex * @PageSize AS varchar)
END
END
END
--PRINT @StrByPage
EXEC sp_executeSql @StrByPage
RETURN