SqlServer存儲過程分頁模板

模板

模板一:採用臨時表變量方式

CREATE PROCEDURE StandardPaging_Template
	@params VARCHAR(20),
							 --以下爲分頁標準參數
	@recordTotal INT OUTPUT, --查詢總記錄數
    @pageSize INT = 50,      --頁記錄數量
    @pageIndex INT = 1       --當前頁,如果爲-1,則返回所有數據
AS
SET NOCOUNT ON;
BEGIN
	
	--定義表變量
	DECLARE @rst AS TABLE(
		ID INT,
		NAME NVARCHAR(20),
		PRIMARY KEY CLUSTERED(ID)
	) 

	--處理篩選後的視圖
	INSERT INTO @rst(ID,NAME)
	SELECT ID,NAME
	FROM tableName
    
	--以下爲分頁標準處理段,對臨時表變量@rst進行分頁處理
	--讀取數據總行數量
	SELECT @recordTotal = Count(*) FROM @rst;
	
	--反饋分頁的數據
	DECLARE @startNum INT,
			@endNum INT;
	SET @startNum = @pageSize * (@pageIndex - 1) + 1;
	SET @endNum = @pageSize * @pageIndex;

	SELECT * FROM(
		SELECT ROW_NUMBER() OVER(ORDER BY ID) AS num, *
		FROM @rst
	) AS t
	WHERE LTRIM(STR(@pageIndex)) = -1
	OR num BETWEEN LTRIM(STR(@startNum)) AND LTRIM(STR(@endNum))
	
END

模板二:採用臨時表方式

CREATE PROCEDURE StandardPaging_Template
	@params VARCHAR(20),
							 --以下爲分頁標準參數
	@recordTotal INT OUTPUT, --查詢總記錄數
    @orderStr NVARCHAR(200), --排序串,如CJSJ DESC
    @pageSize INT = 50,      --頁記錄數量
    @pageIndex INT = 1       --當前頁,如果爲-1,則返回所有數據
AS
SET NOCOUNT ON;
BEGIN
	
	--處理篩選後的視圖
	SELECT *
	INTO #rst
	FROM tableName
    
	--以下爲分頁標準處理段,對臨時表#rst進行分頁處理
	--讀取數據總行數量
	DECLARE @sql NVARCHAR(2000);
	SET @sql = N'select @cnt=count(*) from #rst';
	EXEC sp_executesql @sql, N'@cnt int output', @recordTotal OUTPUT;

	--反饋分頁的數據
	DECLARE @startNum INT,
			@endNum INT;
	SET @startNum = @pageSize * (@pageIndex - 1) + 1;
	SET @endNum = @pageSize * @pageIndex;
	SET @sql = N'
		select * from
		(select ROW_NUMBER() over(order by ' + @orderStr + N') as num, *
		from #rst) as t
		where ' + LTRIM(STR(@pageIndex)) + N'=-1 or num between ' + LTRIM(STR(@startNum)) + N' and ' + LTRIM(STR(@endNum));
	EXEC (@sql);
	
	--清空臨時表(表數據比較大的時候先清空再刪除效率高一點)
	TRUNCATE TABLE #rst
	--刪除臨時表
	DROP TABLE #rst
END

總結

  1. 臨時表變量方式執行完成不需要刪除,相比於臨時表方式減少了操作
  2. 臨時表變量是預先編譯的,臨時表不是
  3. 臨時表變量方式需要考慮應用程序對內存的壓力,需要特別注意內存的消耗,對於比較小的數據集推薦使用臨時表變量的方式。在數據集比較大的時候,推薦使用臨時表,支持創建索引、分組等優化方式,由於臨時表是存放在Tempdb中,一般默認分配的空間比較少,需要對Tempdb進行調優,擴大存儲的空間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章