改良版的SQL Service 通用儲存過程分頁

2022-02-19 18:19:00 字數 2684 閱讀 4956

上次寫了通用儲存過程。感覺還是有很大的bug。就是條件不能引數畫化。這個bug可以說是致命的。但是我一直想在用什麼方法能解決這個東西。其實我只是想寫少量的**來做更多的事情。我想能不能傳集合給儲存過程但是好像這個是行不通沒辦法只能寫死。

上**吧

if (select count(*) from sysobjects s where s.[type]='p' and s.name='sp_page_practical')>0

drop proc sp_page_practical;

go create proc sp_page_practical(@tbname varchar(50),@condition nvarchar(1000),@conditioncolumn varchar(100),@conditioncolumn2 varchar(100),@conditioncolumn3 varchar(100),@conditioncolumn4 varchar(100),@conditioncolumn5 varchar(100),@sortcolumn varchar(100), @isdesc int,@thispage int,@pagerownumber int,@sumpage int out)

as begin

begin transaction

declare @exesql nvarchar(1000) ;

declare @sumrownumber int,@descstr nvarchar(10);

set @exesql='select @sumrownumber=count(*) from '+@tbname+' '+@condition;

--執行動態sql獲取值

exec sp_executesql @exesql, n'@sumrownumber int out,@conditioncolumn varchar(100),@conditioncolumn2 varchar(100),

@conditioncolumn3 varchar(100),@conditioncolumn4 varchar(100),@conditioncolumn5 varchar(100)',

@sumrownumber out,@conditioncolumn,@conditioncolumn2,@conditioncolumn3,@conditioncolumn4,@conditioncolumn5;

--計算總頁數

set @sumpage=(@sumrownumber-1)/@pagerownumber+1;

--計算分頁行

declare @beginrow int,@endrow int;

set @beginrow=(@thispage-1)*@pagerownumber+1;

set @endrow=@thispage*@pagerownumber;

--計算排序

if @isdesc=1

begin

set @descstr='desc';

endelse

begin

set @descstr='asc';

endset @exesql='select * from (select a.*,row_number() over(order by '+@sortcolumn+' '+@descstr+ ') as rowindex from '+@tbname+' a '+@condition+') a where a.rowindex between '+convert(varchar(10),@beginrow)+' and '+convert(varchar(10),@endrow)+'';

exec sp_executesql @exesql,n'@conditioncolumn varchar(100),

@conditioncolumn2 varchar(100),@conditioncolumn3 varchar(100),@conditioncolumn4 varchar(100),

@conditioncolumn5 varchar(100)',@conditioncolumn,@conditioncolumn2,@conditioncolumn3,@conditioncolumn4,@conditioncolumn5;

--事物提交還是回滾

if @@error>0

begin

rollback transaction;

endelse

begin

commit transaction;

end;

end

我想我的專案裡最大5個條件查詢就已經ok。根據你的專案來確定有多少個條件吧 。至於引數怎麼傳遞很簡單。就需要我們發揮無線的思想了。

declare @sumpage int;

exec sp_page_practical 'tb_user_info','where user_info_id=@conditioncolumn and (1=1 or 1=@conditioncolumn2 or 1=@conditioncolumn3 or 1=@conditioncolumn4 or 1=@conditioncolumn5)',1,1,1,1,1,'user_info_id',1,1,10,@sumpage out

上面是我寫的測試程式。如果有1個條件我就申明乙個其他我全部1=1。完全不和其他條件衝突。

如果哪位大神有更好的方法和更好的思路可以解決問題。我們可以一起**和研究哦

改良版插入排序

我們來看一下插入排序定義 插入排序是由未排序的後半部前端取出乙個值,插入已排序前半部的適當位置,概念簡單但速度不快。改良版的插入排序是讓後一次的排序進行時,盡量利用前一次排序後的結果,以加快排序的速度,shell排序法即是基於此概念來改良插入排序法。解法 假設要排序的元素有n個,則每次進行插入排序時...

WinForm 標尺和網格 改良版

using system using system.collections.generic using system.componentmodel using system.drawing using system.drawing.drawing2d using system.data using ...

IIS WebApi和Vue混合發布 改良版

方法有些笨拙,後續又研究了一下,通過修改routeconfig檔案,可實現不破壞view資料夾的形式,直接放置vue的web檔案。具體方法 1 修改routeconfig,直接設定單頁路由 routes.ignoreroute axd name default url defaults new 設定...