插入到选择后SQL Server挂起

时间:2010-03-03 14:15:19

标签: tsql sql-server-2005 insert

感谢您查看此内容。

该问题与以下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 id=@page
    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 !=@page
        ) thegood
        left outer join xref_pages_categories xpc
        on xpc.pageid = thegood.pageid
        where xpc.pageid is null
) final

1 个答案:

答案 0 :(得分: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的一部分那样锁定/阻塞。