1

非常に奇妙なサーバーの動作に遭遇しました-つまり:

以下のように、1 つの TVP 引数で TVF を取得しました

CREATE FUNCTION [BUD].[Foo] (@IdAgrs IdTable READONLY)
RETURNS TABLE
AS
RETURN 
(
    WITH recursive_CTE
    AS
    (
            --> Select here is not important - only that TVP join goes here:

            SELECT Id, IdParent, Number, 1 as 'lvl'
            FROM Agreements ag
                join @IdAgrs ig on ig.Id = ag.Id   --> HERE

            UNION ALL

            SELECT a.Id, a.IdParent, a.Number
                i.lvl + 1
            FROM Agreements e
                INNER JOIN recursive_CTE r ON e.IdParent = r.Id
    )
    select 1
    from recursive_CTE
)

TVP は次のとおりです。

IF NOT EXISTS (select 1 from sys.table_types where name = 'IdTable')
    CREATE TYPE IdTable AS TABLE (Id INT NOT NULL)

今、「奇妙な」部分:

エクスプレス サーバー バージョンで機能を実行しようとすると、フリーズします。つまり、実行時間は非常に長い (4 分間待機した後に実行をキャンセルする) のに対して、フル バージョンでは問題なく実行されます (0 - データはまったくありません)。どちらも2008R2、同じDB、同じTVF、同じTVPです。以下のように TVF を実行

declare @IdAgrs IdTable
insert into @IdAgrs values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)

select * from BUD.Foo(@IdAgrs)

しかし!

TVF の本体を単独で実行すると、魅力的に動作します (WTF?)

declare @IdAgrs IdTable
insert into @IdAgrs values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)

;WITH recursive_CTE
AS
(
    --> Select here is not important - only that TVP join goes here:

    SELECT Id, IdParent, Number, 1 as 'lvl'
    FROM Agreements ag
        join @IdAgrs ig on ig.Id = ag.Id   --> HERE

    UNION ALL

    SELECT a.Id, a.IdParent, a.Number
        i.lvl + 1
    FROM Agreements e
        INNER JOIN recursive_CTE r ON e.IdParent = r.Id
)
select 1
from recursive_CTE

理由がわからない!? Express Edition にはいくつかの制限がありますか?

4

0 に答える 0