2010-03-03 109 views
2

感謝您看看這個。插入選擇後SQL Server掛起

該問題與以下sql查詢有關。基本上,它會遞歸地查找某個頁面(母版頁)下的所有頁面,然後將母版頁的類別(在xref_pages_categories中查找)應用於所有這些頁面。

在運行插入時,查詢表應該已完全插入的數據掛起。

如果我不跑了插入線查詢,結果回來完美,如:

3245 490 
3249 490 
3252 490 

但在把刀片在它的前面和插入,查詢的pageid = 3245只是掛起。有任何想法嗎?

declare @page int; 

set @page=3202; 
begin transaction transki; 

With FindAllPagesUnderneath(PageID, ParentID) as 
(
    select id as PageID, ParentPageId as ParentID 
    from pages where [email protected] 
    union all 
    select id as PageID, ParentPageID as ParentID 
    from pages p 
    inner join FindAllPagesUnderneath mp on 
    p.parentpageid=mp.PageID 
) 

insert into xref_pages_categories (PageID, CategoryID) 


    --get records that definitely arent already in xref_pages_categories 
select * from 
(
    select distinct thegood.* 
    from 
     (
     --get all pages under @page attached to new categoryid 
     select distinct fap2.PageID, fapo.CategoryID 
      from FindAllPagesUnderneath fap2 
      cross join (
       select fap.PageID,xpc.categoryid 
       from xref_pages_categories xpc 
       inner join FindAllPagesUnderneath fap 
       on fap.PageID=xpc.pageid 
       where fap.pageid!=1 and 
       fap.pageid!=1332 
       and fap.parentid=1332 
      ) fapo 
     where fap2.pageid [email protected] 
     ) thegood 
     left outer join xref_pages_categories xpc 
     on xpc.pageid = thegood.pageid 
     where xpc.pageid is null 
) final 
+0

您沒有在您的示例中提交事務。該示例中的錯誤還是錯誤錯誤? 2010-03-03 14:41:14

+0

我相信答案,因爲當我沒有提交臨時表時,它在 – Micah 2010-03-03 19:58:23

回答

0

沒有尋找到所有的代碼,在執行計劃,或者鎖定/阻塞問題,你可以嘗試這個技巧:

的CTE之前創建該表:

CREATE TABLE #TempResults 
(
PageID   ... 
,CategoryID ... 
) 

INSERT進入它而不是xref_pages_categories(使用CTE SELECT)

然後把它放在代碼塊的末尾:

insert into xref_pages_categories (PageID, CategoryID) 
    SELECT PageID, CategoryID FROM #TempResults 

此INSERT應該運行得更快,並且希望不像現在作爲CTE的一部分那樣鎖定/阻止。

+0

之前無法正常工作,但它沒有奏效。即使沒有這個破解,插入也可以立即執行而不會出現任何問題。它的插入後,選擇永久掛起...如果這有所幫助。 感謝您的幫助 – Micah 2010-03-03 14:57:24

+0

我認爲從'WITH'到包括''final''在內的所有內容都是「INSERT」。您是不是使用CTE來填充用行填充INSERT的SELECT?你正在談論的選擇在哪裏? – 2010-03-03 15:09:27

+0

我剛剛在運行代碼後運行了一次提交,並且它的工作原理 - 它昨晚沒有做。我正在考慮你的初始答案(臨時表)是什麼修復它。謝謝謝謝謝謝謝謝謝謝! – Micah 2010-03-03 15:10:25