posts - 495,comments - 227,trackbacks - 0

          本存儲過程實現(xiàn)了多級分類檔案 級聯(lián)刪除技術

          本存儲過程的特點是 :

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

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

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

          版本一

          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 查詢分析器進行測試時可用如下方法進行測試 ( 注意執(zhí)行時三個語句一起執(zhí)行 ) :

          declare @value int

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

          select @value

          ?

          存儲過程說明

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

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

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

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

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 苏尼特右旗| 阳谷县| 凭祥市| 阜宁县| 威海市| 武功县| 新绛县| 尼玛县| 泾阳县| 湟源县| 镇康县| 琼结县| 田林县| 林芝县| 宁强县| 丰都县| 诸城市| 宁波市| 香河县| 手游| 四会市| 奉节县| 枞阳县| 陕西省| 临桂县| 安平县| 甘洛县| 巴林左旗| 夏邑县| 敦煌市| 光山县| 临夏县| 盖州市| 佛冈县| 滦平县| 金山区| 崇仁县| 曲阜市| 屏山县| 扎囊县| 忻城县|