1. 程式人生 > >高效分頁sql儲存過程

高效分頁sql儲存過程

CREATE proc newgetpage
(--預設分頁主鍵為id
 @tblName  nvarchar(128),  --表名稱列表
 @PageSize  int=10,   --頁尺寸
 @PageIndex   int=1,   --當前頁
 @fields   nvarchar(4000)='*', --查詢欄位列表
 @fldname  nvarchar(50),  --主鍵欄位名
 @fldorder  bit=1,   --主鍵排序方式,0asc,非零desc
 @FirstfldName  nvarchar(50)='',              --主排序欄位名,非主鍵,有重複值
 @FirstfldOrder  bit=1,   --主欄位排序方式
 @SecondfldName nvarchar(50)='',              --副排序欄位名,非主鍵,有重複值
 @SecondfldOrder bit=1,   --副欄位排序方式
 @strWhere  nvarchar(1000)='', --查詢條件
 @Iscount  bit=0   --返回記錄總數,非0則返回
)
as
declare @strsql   nvarchar(4000)  --主語句
declare @strtmp   nvarchar(500)  --臨時變數
declare @strorder   nvarchar(500)  --總排序方式
declare @stropporder   nvarchar(500)  --總排序的反方式
declare @strorderfldlist  nvarchar(500)  --所有要排序的欄位序列
declare @selectfld  nvarchar(500)  --選擇主鍵page
declare @selectfirst  nvarchar(500)  --選擇主排序page
declare @selectsecond  nvarchar(500)  --選擇副排序page
/**/
declare @strwheretmp  nvarchar(500)  --臨時where變數
if @strwhere!=''
 set @strwheretmp=' where '
else
 set @strwheretmp=''
/**/
set @strsql=''
set @strtmp=''
set @strorder=''
set @stropporder=''
set @strorderfldlist=''
set @selectfld=''
set @selectfirst=''
set @selectsecond=''
if @pagesize<1
 set @pagesize=10
if @pageindex<1
 set @pageindex=1
if @fields=''
 set @fields='*'
if @FirstfldName=''
 set @FirstfldName=''
if @SecondfldName=''
 set @SecondfldName=''


--------------------------------bengin
----------總排序方式
if @fldorder!=0
 begin
  -----正排序
  set @[email protected] + ' desc '
  if @secondfldname!=''
   if @secondfldorder!=0
    set @[email protected] + ' desc,'[email protected]
   else
    set @[email protected] + ' asc,'[email protected]


  if @firstfldname!=''
   if @firstfldorder!=0
    set @[email protected] + ' desc,'[email protected]
   else
    set @[email protected] + ' asc,'[email protected]
  -----反排序
  set @[email protected] + ' asc '
  if @secondfldname!=''
   if @secondfldorder!=0
    set @[email protected]
+ ' asc,'[email protected]
   else
    set @[email protected] + ' desc,'[email protected]
  if @firstfldname!=''
   if @firstfldorder!=0
    set @[email protected] + ' asc,'[email protected]
   else
    set @[email protected] + ' desc,'[email protected]
 end
else
 begin
  -----正排序
  set @[email protected] + ' asc '
  if @secondfldname!=''
   if @secondfldorder!=0
    set @[email protected] + ' desc,'[email protected]
   else
    set @[email protected] + ' asc,'[email protected]
  if @firstfldname!=''
   if @firstfldorder!=0
    set @[email protected] + ' desc,'[email protected]
   else
    set @[email protected] + ' asc,'[email protected]
  -----反排序
  set @[email protected] + ' desc '
  if @secondfldname!=''
   if @secondfldorder!=0
    set @[email protected] + ' desc,'[email protected]
   else
    set @[email protected] + ' asc,'[email protected]
  if @firstfldname!=''
   if @firstfldorder!=0
    set @[email protected] + ' desc,'[email protected]
   else
    set @[email protected] + ' asc,'[email protected]
 end
set @stropporder=' order by '[email protected]
set @strorder=' order by '[email protected] +' '
---------總排序方式end
---------總排序欄位序列
set @strorderfldlist='id'
if @firstfldname!=''
 begin
 set @[email protected]+','[email protected]
 if @secondfldname!=''
  set @[email protected]+','[email protected]
 end
---------總排序欄位序列end
if @Firstfldname!=''
-------若主排序欄位不空,則按主排序欄位排序,
 begin 
  if @fldorder!=0  
       set @strTmp = '<=(select top 1'
  else
       set @strTmp = '>=(select top 1'
  set @[email protected] + replace(@strtmp,'=','')+'('[email protected]+')from(select top ' + str((@PageIndex-1)*@PageSize)
   + ' '[email protected] +' from  '[email protected]+' '[email protected][email protected] [email protected]
   +')as tbltmp '+ @stropporder +')'
  if @firstfldname!=''
   set @selectfirst=' and '[email protected] + @strtmp+'('[email protected]+')from(select top ' + str((@PageIndex-1)*@PageSize)
    + ' '[email protected] +' from  '[email protected]+' '[email protected][email protected] [email protected]
    +')as tbltmp '+ @stropporder +')'
  if @secondfldname!=''
   set @selectsecond=' and '[email protected] + @strtmp+'('[email protected]+')from(select top ' + str((@PageIndex-1)*@PageSize)
    + ' '[email protected] +' from  '[email protected]+' '[email protected][email protected] [email protected]
    +')as tbltmp '+ @stropporder +')'
  ------------多欄位排序程式碼

  set @strSQL = 'select top ' + str(@PageSize) + ' '[email protected]+' from '
      + @tblName + ' where ' + @selectfld + @selectfirst+ @selectsecond+ @strOrder
 
  if @strWhere != ''
      set @strSQL = 'select top ' + str(@PageSize) + ' '[email protected]+' from '
          + @tblName + ' where ' + @selectfld + @selectfirst+ @selectsecond+' and ' + @strWhere + ' ' + @strOrder

  ------------多欄位排序程式碼end
 end
-------若主排序欄位不空,則按主排序欄位排序,end
else
-------若主排序欄位為空,則按主鍵排序,
 begin
  if charindex('.',@fldname)>0
   set @selectfld=substring(@fldname,charindex('.',@fldname)+1,len(@fldname))
  else
   set @[email protected]
  if @fldorder!=0  
   begin
       set @strTmp = '<(select top 1'
       set @strOrder = ' order by ' + @fldName +' desc'
       set @stropporder=' order by '[email protected] +' asc'
   end
  else
   begin
       set @strTmp = '>(select top 1'
       set @strOrder = ' order by ' + @fldName +' asc'
       set @stropporder=' order by '[email protected] +' desc '
   end
  
  set @strSQL = 'select top ' + str(@PageSize) + ' '[email protected]+' from '
   + @tblName + ' where ' + @fldName + '' + @strTmp + '('
   + @selectfld + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
   + @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp '[email protected] +')'
   + @strOrder
  
  if @strWhere != ''
   set @strSQL = 'select top ' + str(@PageSize) + ' '[email protected]+' from '
           + @tblName + ' where ' + @fldName + '' + @strTmp + '('
           + @selectfld + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
           + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
           + @strOrder + ') as tblTmp '[email protected] +') and ' + @strWhere + ' ' + @strOrder
 end
-------若主排序欄位為空,則按主鍵排序,end
if @PageIndex = 1
begin
    set @strTmp = ''
    if @strWhere != ''
        set @strTmp = ' where ' + @strWhere

    set @strSQL = 'select top ' + str(@PageSize) + ' '[email protected]+' from '
        + @tblName + '' + @strTmp + ' ' + @strOrder
end

if @IsCount != 0
begin
    set @strSQL = 'select count(*) as Total from ' + @tblName + ''
if @strWhere!=''
    set @strSQL='select count(*) as Total from '[email protected] +' where ' [email protected]
end
--print @strsql
exec (@strSQL)
GO

相關推薦

高效sql儲存過程

CREATE proc newgetpage (--預設分頁主鍵為id  @tblName  nvarchar(128),  --表名稱列表  @PageSize  int=10,   --頁尺寸  @PageIndex   int=1,   --當前頁  @fields

查詢儲存過程sql語句

--建立分頁的儲存過程 alter procedure proc_page @tabName varchar(50), @pageIndex int=1, @pageSize int=5, @pk varchar(20)='id', @cols varchar(200)

SQL 分割字串和通用查詢儲存過程

USE [sg]  --使用某個資料庫 GO /****** Object:  StoredProcedure [dbo].[findTableIndex]    Script Date: 2017/4/1 17:02:58 ******/ SET ANSI_NULLS

Oracle學習筆記 -儲存過程,自增

Oracled 的欄位自增,查詢,遊標的返回,儲存過程。 1,自增(觸發器) //還有一個條件需要增加一個佇列 create or replace TRIGGER MYSYSTEM.CBOUNCEID BEFORE INSERT ON MYSYSTEM.BOUNCERECORD

MSSQL的查詢儲存過程

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go --分頁儲存過程 CREATE PROCEDURE [dbo].[sp_Paging] ( @Tables nvarchar(1000),

SQLSERVER通用儲存過程

USE [DataBase] GO /****** Object: StoredProcedure [dbo].[CommonPagenation] Script Date: 06/28/2016 10:41:58 ******/ SET ANSI_NULLS ON GO

MySQL資料庫儲存過程

MySQL的的的的分頁通用的儲存過程可以先寫出這幾行程式碼:SET @ 變數名 = CONCAT('select * from person limit',((1-1)* 5),',',5,''); FROM @變數名;EXECUTE a;當你發現在你的資料庫儲存過程資料夾有

SQL儲存過程

</pre><pre name="code" class="sql">ALTER proc [dbo].[GetGoodsLsit] ----分頁條件 @StartIndex varchar(20), @PageSize varchar(20), ----排序條件

SQL儲存過程與遊標使用

儲存過程: CREATE procedure p_splitpage    @sql nvarchar(4000), --要執行的sql語句  @page int=1,    --要顯示的頁碼 @pageSize int,&n

SQL儲存過程用法

create  procedure [dbo].[psys_Paging]@sql text, --要執行的sql語句@page int,    --要顯示的頁碼@pageSize int,  --每頁的大小@pageCount int=0 out, --總頁數@recordCount int=0 out -

Oracle 高效儲存過程例項 含javademo

  關於分頁,想必是每一程式猿都會遇到的問題,解決辦法有很多,  接下來就讓我們嘗試下 oracle 儲存過程實現,直接在資料庫層面實現,重點在於高效  1首先建立 儲存過程用的包,以及宣告儲存過程 --建立包 -- Author : Sugar -- Created

簡單的SQL儲存過程

USE [testActice] GO /****** Object: StoredProcedure [dbo].[getpagelist] Script Date: 06/12/2017 1

sql server存儲過程

order span exe 存儲 數據 reat 過大 where 排序類 因項目需要,一次性查詢出來的數據過大,內存hold不住,所以特意寫成分頁查詢,減小占用內存。 存儲過程如下: USE [XXX] GO SET ANSI_NULLS ON GO SET QU

MS SQL 存儲過程

bsp RF class 自己 mon max sql rec none 最近換了家新公司,但是新公司沒有使用分頁的存儲過程。哎~~,硬著頭皮自己嘗試寫了一個,別說還挺好用的。(效率怎麽樣就不怎麽清除沒有詳細的測試過) CREATE PROCEDURE [dbo].[

MSSQLServer資料庫大量資料按月份表、儲存過程指定時間段跨表查詢

比較完善的大量資料分表功能程式碼,包含建立資料庫、生成資料、測試結果。適合初學分表者使用。 資料按照每個月建立一個數據表,通過儲存過程輸入引數,按照指定日期跨表查詢資料,並且可以分頁查詢。 有如下表: table_20180101table_20180201 table_

SQL 高效(百萬條資料)ROW_NUMBER() OVER (ORDER BY id) |

第一種方法:效率最高 SELECT TOP 頁大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,

My Sql 高效

/* *普通分頁 *在資料檔案上偏移1000000查出10條 */ select * from zoldesk_92game_net_ecms_bj where classid=303 ORDER BY id ASC LIMIT 1000000,10 ; /*

Delphi調用SQL存儲過程實例

char sele des 高度 nbsp dna procedure one 變量 Delphi調用SQL分頁存儲過程實例 (2008-11-18 17:12:35)轉載▼ 標簽: it 分類: Delphi相關 //-----下面是一個支持任意表的 SQL SE

SQL儲存過程——求每小時的99位數

第二篇部落格,想分享一下在實習工作中一個SQL的儲存過程。在寫這個儲存過程的時候,查閱了各大百度,貼吧,部落格上的資料,但是均是沒有找到99分位數的寫法。可能是這個的應用場景較少吧。但是也希望會對一些童鞋有幫助。 99分位數的邏輯想必大家都清楚,總共三步:

SQL 高效(百萬條資料)

ROW_NUMBER() OVER (ORDER BY id) | 分頁 SELECT TOP 頁大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER