本存儲過程實現了多級分類檔案
級聯刪除技術
本存儲過程的特點是
:
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 閱讀(279)
評論(0) 編輯 收藏