2013-04-10 116 views
-1

我有以下存儲過程,每次應用程序做一些刪除操作時,我都必須執行這些存儲過程。我的問題是,如果你們中的任何一個人知道某種方式,加快這個存儲過程。加速sql存儲過程

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)在表中找不到。之後,第二個刪除語句將被執行。這次相同的語句找不到之前執行的元素的任何ElementIds。

重要提示: 在執行存儲過程之前,應用程序已刪除一個元素。之後,整個結構將被保存。之後,所有父母不存在的元素將被存儲過程刪除。

該環境是一個SQL Server 2008 R2。 提前謝謝!

安德烈

+0

我不明白的第二個delete語句是什麼。當然這是多餘的,因爲第一次刪除將刪除所有必要的「元素」? – 2013-04-10 07:58:21

+0

它看起來並不像第二次刪除與已經指出的不同。 – Ric 2013-04-10 08:01:15

+1

這是一個樹形結構。如果您刪除了具有兒童的元素,則也必須刪除兒童。 – Andre 2013-04-10 08:01:23

回答

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