USP_SITE_DELETE
Executes the "Site: Delete" record operation.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | Input parameter indicating the ID of the record being deleted. |
@CHANGEAGENTID | uniqueidentifier | IN | Input parameter indicating the ID of the change agent invoking the delete. |
Definition
Copy
CREATE procedure dbo.USP_SITE_DELETE
(
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
begin try
--Have to move nodes up in hierarchy before deleting the site record
declare @PATHTODELETE hierarchyid;
declare @DELETEDPATHROOT hierarchyid;
declare @INSERTBEFOREPATH hierarchyid;
--Get the path of the site to be deleted, it's parent's path, and the path of it's next sibling
select
@PATHTODELETE=HIERARCHYPATH,
@DELETEDPATHROOT=isnull(HIERARCHYPATH.GetAncestor(1),hierarchyid::GetRoot()) ,
@INSERTBEFOREPATH=(select top 1 HIERARCHYPATH from dbo.SITE as SIBLINGSITE where SIBLINGSITE.HIERARCHYPATH.GetAncestor(1)=isnull(SITE.HIERARCHYPATH.GetAncestor(1),hierarchyid::GetRoot()) and SIBLINGSITE.HIERARCHYPATH > SITE.HIERARCHYPATH order by HIERARCHYPATH)
from
dbo.SITE
where
ID = @ID;
if exists(select ID from dbo.SITE where HIERARCHYPATH.IsDescendantOf(@PATHTODELETE) = 1 and SITE.HIERARCHYPATH <> @PATHTODELETE)
begin
with SITE_CURRENT_HIERARCHY as
(
--Get the current hierarchy structure
select
ID,
HIERARCHYPATH,
isnull(HIERARCHYPATH.GetAncestor(1), hierarchyid::GetRoot()) as PARENTHIERARCHYPATH,
(select top 1 HIERARCHYPATH from dbo.SITE as SIBLINGSITE where SIBLINGSITE.HIERARCHYPATH.GetAncestor(1)=SITE.HIERARCHYPATH.GetAncestor(1) and SIBLINGSITE.HIERARCHYPATH < SITE.HIERARCHYPATH order by HIERARCHYPATH desc) as PREVIOUSSIBLING
from
dbo.SITE
where
HIERARCHYPATH.IsDescendantOf(@PATHTODELETE) = 1 and
HIERARCHYPATH <> @PATHTODELETE
),
SITE_NEW_HIERARCHY as
(
--Designate new path for sites beneath the site to be deleted that don't have a previous sibling. The new hierarchy path will be used to assign the next siblings path.
select
ID,
@DELETEDPATHROOT.GetDescendant(@PATHTODELETE, @INSERTBEFOREPATH) as NEWHIERARCHYPATH,
HIERARCHYPATH as PREVIOUSPATH,
@DELETEDPATHROOT as NEWPARENTPATH
from
SITE_CURRENT_HIERARCHY
where
SITE_CURRENT_HIERARCHY.PARENTHIERARCHYPATH = @PATHTODELETE and SITE_CURRENT_HIERARCHY.PREVIOUSSIBLING is null
union all
--Designate new path for sites beneath the site to be deleted. The new path is found by using the previous siblings new path.
select
SITE_CURRENT_HIERARCHY.ID,
@DELETEDPATHROOT.GetDescendant(SIBLINGVALUE.NEWHIERARCHYPATH, @INSERTBEFOREPATH) as NEWHIERARCHYPATH,
HIERARCHYPATH as PREVIOUSPATH,
@DELETEDPATHROOT as NEWPARENTPATH
from
SITE_CURRENT_HIERARCHY
inner join SITE_NEW_HIERARCHY as SIBLINGVALUE on SIBLINGVALUE.PREVIOUSPATH = SITE_CURRENT_HIERARCHY.PREVIOUSSIBLING
where
SITE_CURRENT_HIERARCHY.PARENTHIERARCHYPATH = @PATHTODELETE and SITE_CURRENT_HIERARCHY.PREVIOUSSIBLING is not null
union all
--Move site nodes up one level that do not have a previous sibling
select
SITE_CURRENT_HIERARCHY.ID,
PARENTVALUE.NEWHIERARCHYPATH.GetDescendant(null,null) as NEWHIERARCHYPATH,
HIERARCHYPATH as PREVIOUSPATH,
PARENTVALUE.NEWHIERARCHYPATH as NEWPARENTPATH
from
SITE_CURRENT_HIERARCHY
inner join SITE_NEW_HIERARCHY as PARENTVALUE on PARENTVALUE.PREVIOUSPATH = SITE_CURRENT_HIERARCHY.PARENTHIERARCHYPATH
where
SITE_CURRENT_HIERARCHY.PARENTHIERARCHYPATH <> @PATHTODELETE and SITE_CURRENT_HIERARCHY.PREVIOUSSIBLING is null
union all
--Move site nodes up one level that do not have a previous sibling. The new path is found by using the previous siblings new path.
select
SITE_CURRENT_HIERARCHY.ID,
SIBLINGVALUE.NEWPARENTPATH.GetDescendant(SIBLINGVALUE.NEWHIERARCHYPATH,null) as NEWHIERARCHYPATH,
HIERARCHYPATH as PREVIOUPATH,
SIBLINGVALUE.NEWPARENTPATH
from
SITE_CURRENT_HIERARCHY
inner join SITE_NEW_HIERARCHY as SIBLINGVALUE on SIBLINGVALUE.PREVIOUSPATH = SITE_CURRENT_HIERARCHY.PREVIOUSSIBLING
where
SITE_CURRENT_HIERARCHY.PARENTHIERARCHYPATH <> @PATHTODELETE and SITE_CURRENT_HIERARCHY.PREVIOUSSIBLING is not null
)
update
dbo.SITE
set
SITE.HIERARCHYPATH = SITE_NEW_HIERARCHY.NEWHIERARCHYPATH
from
dbo.SITE
inner join SITE_NEW_HIERARCHY on SITE_NEW_HIERARCHY.ID = SITE.ID;
end;
exec dbo.USP_SITE_DELETEBYID_WITHCHANGEAGENTID @ID, @CHANGEAGENTID;
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;