-1

每次应用程序执行某些删除操作时,我都必须执行以下存储过程。我的问题是,如果你们中的任何人知道某种方式,来加速这个存储过程。

DECLARE @CID UNIQUEIDENTIFIER
SET @CID = @CategoryId


DELETE FROM Elements 
WHERE CategoryId = @CID
AND ParentId IS NOT NULL
AND ParentId NOT IN (SELECT ElementId FROM Elements WHERE CategoryId = @CID)


WHILE (@@ROWCOUNT  > 0)
BEGIN
    DELETE FROM Elements
    WHERE CategoryId = @CID
    AND ParentId IS NOT NULL
    AND ParentId NOT IN (SELECT ElementId FROM Elements WHERE CategoryId = @CID)
END

这里的结构:

Element 1
Element 2
    Element 2.1
    Element 2.2
    Element 2.3
        Element 2.3.1
        Element 2.3.2
Element 3
...

例如,如果“元素 2”被删除,则所有子元素也必须被删除。

查询如何工作: 如果我删除“元素 2”并执行存储过程,第一个删除语句将删除“元素 2.1”、“元素 2.2”和“元素 2.3”,因为它的 ParentId(“元素 2”的 ElementId ) 在表中找不到。之后将执行第二个删除语句。这次同样的语句找不到之前执行删除的Elements的任何ElementIds。

重要提示: 在执行存储过程之前,应用程序已经删除了一个元素。之后,整个结构将被保存。之后,所有父级不存在的元素将被存储过程删除。

环境是 SQL Server 2008 R2。先感谢您!

安德烈

4

1 回答 1

0

试试这个解决方案 -

SET NOCOUNT ON;

DECLARE @Node NVARCHAR(50)
SELECT @Node = 'Element 2.3'

DECLARE @temp TABLE
(
  Node NVARCHAR(50) PRIMARY KEY
, ParentNode NVARCHAR(50) NULL 
)

INSERT INTO @temp (Node, ParentNode)
VALUES 
('Element 1', NULL),
('Element 2', NULL),
('Element 2.1', 'Element 2'),
('Element 2.2', 'Element 2'),
('Element 2.3', 'Element 2'),
('Element 2.3.1', 'Element 2.3'),
('Element 2.3.2', 'Element 2.3'),
('Element 3', NULL)

; WITH nodes (Node) AS 
(
SELECT d.Node
FROM @temp d
WHERE d.Node = @Node

UNION ALL

SELECT d.Node
FROM @temp d
JOIN nodes d3 ON d3.Node = d.ParentNode
)

DELETE FROM t
FROM @temp t
JOIN nodes n ON t.Node = n.Node

SELECT * 
FROM @temp
于 2013-04-10T11:25:24.517 回答