2010-03-03 82 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