通用版上移下移儲存過程

2022-02-21 13:08:30 字數 3756 閱讀 1371

今天終於寫出乙個通用版的上移下移儲存過程,表明,主鍵名,排序欄位名等都是動態的,之前寫了個針對特殊表的上移下移操作顯然顯得很不靈活。

在下面的儲存過程中,包含了許多寫動態儲存過程的思想。由於我是新手,尤其是對於動態儲存過程(trans_sql)剛剛接觸。接下來一篇寫點關於動態儲存過程的!順便總結一下該篇包含的思想!

use [weigou2]

go/****** object: storedprocedure [dbo].[proc_moveupordown2] script date: 07/30/2013 14:42:38 ******/

set ansi_nulls on

goset quoted_identifier on

goalter procedure [dbo].[proc_moveupordown2]

@keyfiled varchar(20), --主鍵字段

@keyvalue int , --主鍵值(一般是id,並且設定自動增長)

@ordertype as int, --0公升序,1降序

@tabelname as varchar(20), --表明

@sortfield as varchar(20)--排序字段

asdeclare @currentorderid int --當前標誌id的排序id

declare @nextid int --下乙個資料標誌id

declare @nextorderid int --下乙個資料的排序id

declare @lastid int --上乙個資料的標誌id

declare @lastorderid int --上個資料的排序id

declare @temple varchar(10) --操作過程中varvhar 和int之間的轉換

declare @maxorderid int --降序時最大排序id

declare @minorderid int --公升序是最小排序id

declare @tempsql varchar(200) --中間sql語句,存放最後執行的sql語句

declare @tempfield varchar(20) --中間sql語句,存放中間變數

begin

set @tempsql='select '+@sortfield+' as t into ##temptable from '+@tabelname+ ' where '+@keyfiled+'='+cast(@keyvalue as varchar(3))+'' --選擇出當前排序編號

exec(@tempsql)

select @currentorderid=t from ##temptable --從臨時表中選擇出排序編號

drop table ##temptable --刪除臨時表

--找出原有資料中最大orderid和最小orderid

set @tempsql='select min('+@sortfield+') as minkey ,max('+@sortfield+') as maxkey into ##temptable2 from '+@tabelname

exec(@tempsql)

set @minorderid= (select minkey from ##temptable2)

set @maxorderid=(select maxkey from ##temptable2)

drop table ##temptable2

if(@ordertype=0)

begin --公升序

if(@currentorderid<>@minorderid) --當前id不等於最小id才有公升序資格

begin

--查詢下乙個資料的id和orderid

set @tempsql='select top 1 '+@keyfiled+' as keyfiled ,'+@sortfield+' as sortfiled into ##temptable3 from '+@tabelname +' where '+@sortfield+' < '+cast(@currentorderid as varchar(3)) +' order by '+@sortfield +' desc'

exec(@tempsql)

select @lastid=keyfiled from ##temptable3

select @lastorderid=sortfiled from ##temptable3

--當前orderid的排序編號和上乙個對換

set @tempsql='update '+@tabelname+' set '+@sortfield+'='+ cast(@currentorderid as varchar(3))+' where '+@keyfiled+'='+cast(@lastid as varchar(3))

set @tempsql=@tempsql+' update '+@tabelname+' set '+@sortfield+'='+cast(@lastorderid as varchar(3))+' where '+@keyfiled+'='+cast(@keyvalue as varchar(3))

exec(@tempsql)

drop table ##temptable3 --dorp臨時表

endend

else --降序

begin

if(@currentorderid<>@maxorderid) --當前id不等於最大id才有公升序資格

begin

--查詢下乙個資料的id和orderid

set @tempsql='select top 1 '+@keyfiled+' as keyfiled ,'+@sortfield+' as sortfiled into ##temptable3 from '+@tabelname +' where '+@sortfield+' > '+cast(@currentorderid as varchar(3)) +' order by '+@sortfield +' asc'

exec(@tempsql)

select @nextid=keyfiled from ##temptable3

select @nextorderid=sortfiled from ##temptable3

--當前orderid的排序編號和上乙個對換

set @tempsql='update '+@tabelname+' set '+@sortfield+'='+ cast(@currentorderid as varchar(3))+' where '+@keyfiled+'='+cast(@nextid as varchar(3))

set @tempsql=@tempsql+' update '+@tabelname+' set '+@sortfield+'='+cast(@nextorderid as varchar(3))+' where '+@keyfiled+'='+cast(@keyvalue as varchar(3))

exec(@tempsql)

drop table ##temptable3 --dorp臨時表

endend

end

使用方法:exec proc_moveupordown2 'id',3,1,'tablename,'orderid'

在sql2008中可以除錯儲存過程,這無疑給要寫非常長的儲存過程提供了極大的方便。(檢視該片

上移 下移功能

實現資料的上移和下移功能 實現效果如下 功能實現過程為 上移和下移是交換兩條資料的位置序號。我將主要業務放在service,具體操作放在dao中。上移的service層 public void moveup long id 交換position的值 int temp forum.getpositio...

ListBox 上移下移

前台html div style width 600px margin 0px auto div style float left asp listbox id lsboxhotword runat server height 300px asp listbox div div style floa...

通用的排序的上移下移功能

前兩天需要實現乙個上移下移功能,就上網上搜了一下,沒想到這個簡單的小功能也沒有搜到特別理想的結果,只有自己動手豐衣足食了,雖然簡單,但是希望對大家有所幫助。功能 實現任意有排序字段表單的上移和下移,並可以按分類來操作排序。首先是儲存過程 寫的稍微有些繁瑣,可能是半夜太睏了吧 1alter proce...