posts - 495,comments - 227,trackbacks - 0

          本存儲過程實現了多級分類檔案 級聯刪除技術

          本存儲過程的特點是 :

          n ????????? 可以在不同的數據庫表上應用此存儲過程 , 達到通用化

          n ????????? 同時用戶也可以根據不同的表結構 , 選擇相應版本的的存儲過程 , 在這里共有三個版本可供用戶選擇 , 分別對應表結構中有無節點的深度字段等情況

          進行調用本存儲過程時只需要傳遞節點號及表名即可 , 但是用戶選擇相應版本進行應用時 , 需要針對實際情況作出選擇

          版本一

          CREATE procedure prcDelete(@vSourceID varchar(30),@Table varchar(20), @iOK int output)

          as

          declare @iDepth int

          declare @SQLString nvarchar(500)

          set @SQLString=N'select vID from '+@Table +' where vID = '''+ltrim(rtrim(@vSourceID))+''''

          exec(@SQLString)

          if @@rowcount > 0

          begin

          ?? ?? set @SQLString=N'select @iDepth=iDepth from '+@table+ ' where vID = '''+ltrim(rtrim(@vSourceID))+''''

          ???????? exec sp_executesql @SQLString,N'@iDepth int output',@iDepth output

          ???????? select @vSourceID as vID,@iDepth as iDepth into #t

          ???????? set @SQLString=N'insert #t select vID,iDepth from '+@Table +' where vParentID in (select vID from #t where iDepth=@iDepth-1)'

          ???????? while @@rowcount > 0

          ???????? begin

          ?????????????????? set @iDepth=@iDepth+1

          ??????? ?? exec sp_executesql @SQLString,N'@iDepth int',@iDepth

          ???????? end

          ???????? set @SQLString=N'delete from '+@Table +' where vID in (select vID from #t) '

          ???????? begin tran

          ???????? exec sp_executesql @SQLString

          ???????? if @@error<>0 goto Err

          ???????? commit

          ???????? select @iOK=0

          ???????? return

          ???????? Err:

          ???????? ?? rollback

          ???????? ?? select @iOK=1

          end

          else

          begin

          ???????? select @iOK=1

          end

          ?

          版本二

          CREATE procedure prcDelete(@vSourceID varchar(30),@Table varchar(20), @iOK int output)

          as

          declare @level int

          declare @SQLString nvarchar(500)

          set @SQLString=N'select vID from '+@Table +' where vID = '''+ltrim(rtrim(@vSourceID))+''''

          exec(@SQLString)

          if @@rowcount > 0

          begin

          ???????? set @level=0

          ???????? select @vSourceID as vID,@level as level into #t

          ???????? set @SQLString=N'insert #t select vID,@level from '+@Table +' where vParentID in (select vID from #t where level=@level-1) '

          ???????? while @@rowcount > 0

          ???????? begin

          ?????????????????? set @level=@level+1

          ??????? ?? exec sp_executesql @SQLString,N'@level int',@level

          ???????? end

          ???????? set @SQLString=N'delete from '+@Table +' where vID in (select vID from #t) '

          ???????? begin tran

          ???????? exec sp_executesql @SQLString

          ???????? if @@error<>0 goto Err

          ???????? commit

          ???????? select @iOK=0

          ???????? return

          ???????? Err:

          ???????? ? ? rollback

          ???????? ?? select @iOK=1

          end

          else

          begin

          ???????? select @iOK=1

          end

          ?

          版本三

          CREATE procedure prcDelete(@vSourceID varchar(30),@Table varchar(20), @iOK int output)

          as

          declare @vParentID varchar(30)

          declare @SQLString nvarchar(500)

          set @SQLString=N'select vID from '+@Table +' where vID = '''+ltrim(rtrim(@vSourceID))+''''

          exec(@SQLString)

          if @@rowcount > 0

          begin

          ???????? select @vSourceID as vID,@vParentID as vParentID into #t

          ???????? set @SQLString=N'insert #t select vID,vParentID from '+@Table +' where vParentID in (select vID from #t) and vID not in(select vID from #t)'

          ???????? while @@rowcount > 0

          ??????? ?? exec(@SQLString)

          ???????? set @SQLString=N'delete from '+@Table +' where vID in (select vID from #t) '

          ???????? begin tran

          ???????? exec sp_executesql @SQLString

          ???????? if @@error<>0 goto Err

          ???????? commit

          ???????? select @iOK=0

          ???????? return

          ???????? Err:

          ???????? ?? rollback

          ???????? ?? select @iOK=1

          end

          else

          begin

          ???????? select @iOK=1

          end

          ?

          三種版本的比較

          版本一適合以下表結構

          create table CustomerClass(

          vID??? varchar(30) constraint pkCustomerClass primary key ,

          vCustomerClassName varchar(40) NOT NULL,

          vRemarks???????? varchar(80) NULL,

          vParentIDvarchar(30) NULL,

          iDepth?????? Int NOT NULL

          )

          版本二和版本三適合以下表結構

          create table CustomerClass(

          vID??? varchar(30) constraint pkCustomerClass primary key ,

          vCustomerClassName varchar(40) NOT NULL,

          vRemarks???????? varchar(80) NULL,

          vParentIDvarchar(30) NULL

          )

          另外用戶如果要在 SQL 查詢分析器進行測試時可用如下方法進行測試 ( 注意執行時三個語句一起執行 ) :

          declare @value int

          exec prcDelete '002','CustomerClass',@iOK=@value output

          select @value

          ?

          存儲過程說明

          n????????? 本存儲過程利用輸出參數來說明級聯刪除操作是否成功 , 返回 0 表示成功 ,1 表示失敗

          n????????? 本存儲過程利用事務來進行刪除 , 確保操作安全和數據的完整性 , 數據完整性在這里指的是 , 若某一檔案已經在外部引用過了 , 即其他表中的外關鍵字使用過了 , 則刪除本結點或是包含這一結點的結點 , 都會進行事務控制 , 返回 1, 說明不允許刪除

          n????????? 另外本存儲過程對傳入的結點進行審核 , 確定在本表中有這一結點時才進行接下來的刪除操作 , 否則返回 1, 說明結點不存在或傳入結點有誤

          Copyright 2003-2005 www.sohozu.com All Rights Reserved
          posted on 2006-09-12 13:32 SIMONE 閱讀(281) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 黑水县| 长沙县| 始兴县| 桑日县| 钦州市| 吐鲁番市| 九龙县| 濉溪县| 望江县| 贵德县| 南皮县| 屏南县| 新疆| 德庆县| 封丘县| 大冶市| 黑龙江省| 田东县| 赣州市| 漳浦县| 温州市| 额济纳旗| 桦川县| 北票市| 五大连池市| 简阳市| 三门县| 时尚| 南华县| 青州市| 麻阳| 黄山市| 自治县| 长垣县| 平泉县| 绥化市| 远安县| 郸城县| 新宾| 汤原县| 厦门市|